ジョン・ドウ:
私は、内部ノードと終端ノードでツリー状の構造を持っています:
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);
});
}
あなたがリストをしたい場合は、単にそのメソッド呼び出しの結果を収集することができます。