ツリー ノードのデスカンダントであるすべてのリーフ ノードを取得するように依頼されました。私はすぐに、この仕事を 1 行で行うことができるという考えにたどり着きました!
public Set<TreeNode<E>> getLeaves() {
return getChildrenStream().flatMap(n -> n.getChildrenStream()).collect(toSet());
}
一見良かったのですが、すぐにStackOverflowExcepetion
ツリーの深さが 10 に達すると、受け入れられないものに遭遇しました。後で、再帰とストリームを使用しない実装を開発しました (ただし、私の脳はローストされflatMap
ています)が、ストリームの内部に触れずに再帰を実行することは不可能であることがわかったため、ストリームを使用して再帰を実行する方法があるかどうかはまだ疑問に思っています。それを行うには、新しい Op が必要になるか、すべての結果をすべてのステップRecursiveOps
に収集して、後で操作する必要があります。Set
Set
Set<TreeNode<E>> prev = new HashSet<>();
prev.add(this);
while (!prev.isEmpty()) {
prev = prev.stream().flatMap(n -> n.getChildrenStream()).collect(toSet());
}
return prev;
見た目ほど良くない。ストリームはパイプラインであることを意図しています。その結果と中間結果は、端末操作が追加されるまで計算されません。上記のアプローチは、明らかにその原則に違反しています。ストリームほど簡単に並列化することもできません。すべての中間結果を手動で計算せずに再帰的に flatMap を実行できますか?
PS1: TreeNode 宣言:
public class TreeNode<E> {
// ...
/**
* Get a stream of children of the current node.
*
*/
public Stream<TreeNode<E>> getChildrenStream(){
// ...
}
public Set<TreeNode<E>> getLeaves() {
// main concern
}
}f