<分区>
我被要求检索作为树节点后裔的每个叶节点。我很快想到我可以在一行中完成这项工作!
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;
没有想象中的那么好。流意味着成为管道。在添加终端操作之前,不会计算其结果和中间结果。上述方法显然违反了该原则。 parellelize 也不像流那样容易。我可以在不手动计算所有中间结果的情况下递归 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