使用流递归展平列表

我有内部节点和终端节点的树状结构:


public interface Node

{

}


public class InternalNode implements Node {

    private List<Node> nodes;

}


public class TerminalNode implements Node {

    private String label;

}

我现在有一个List<Node>我想压平的。在这里,展平意味着我想用它的孩子递归地替换一个内部节点,直到所有内部节点都被终端替换。


我想出了这个功能:


private static List<Node> flatten(final List<Node> nodes) {

    return nodes

            .stream()

            .map(node -> {

                if (node instanceof InternalNode) {

                    return flatten(((InternalNode) node).getNodes());

                }

                return Collections.singletonList(node);

            })

            .flatMap(List::stream)

            .collect(Collectors.toList());

}

这似乎完成了它的工作。但是,我想知道是否有更好的实现方式。我首先必须将 a 包装TerminalNode成一个单例列表(类型List<TerminalNode>) via Collections.singletonList(node),然后我必须再次将该单例列表转换回节点,这似乎很奇怪flatMap(List::stream)。


有没有办法避免这种无用的情况,Collections.singletonList(node)然后flatMap(List::stream)是终端节点?


缥缈止盈
浏览 118回答 1
1回答

慕工程0101907

你可以直接使用 flatMap :private static Stream<TerminalNode> flatten(final List<Node> nodes) {&nbsp; &nbsp; return nodes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .flatMap(node -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (node instanceof InternalNode) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return flatten(((InternalNode) node).getNodes());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Stream.of((TerminalNode) node);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });}如果你想要一个列表,你可以只收集该方法调用的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java