再帰的ストリームのリストを平らに

ジョン・ドウ:

私は、内部ノードと終端ノードでツリー状の構造を持っています:

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());
}

これは、その仕事をするようです。より良好な実装がある場合しかし、私は疑問に思って。私が最初にラップしていることを奇妙に思えるTerminalNode(タイプのシングルトンリストにList<TerminalNode>経由)Collections.singletonList(node)し、後で私は経由して再びノードへのシングルトンリスト背中を変換する必要がありますflatMap(List::stream)

この役に立たないようにする方法があるCollections.singletonList(node)が続くflatMap(List::stream)終端ノードのためには?

JB Nizet:

あなただけの直接flatMapを使用することができます。

private static Stream<TerminalNode> flatten(final List<Node> nodes) {
    return nodes
            .stream()
            .flatMap(node -> {
                if (node instanceof InternalNode) {
                    return flatten(((InternalNode) node).getNodes());
                }
                return Stream.of((TerminalNode) node);
            });
}

あなたがリストをしたい場合は、単にそのメソッド呼び出しの結果を収集することができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=178588&siteId=1