参见英文答案 >
In Java, how do I efficiently and elegantly stream a tree node’s descendants? 4个
我被要求检索作为树节点的descandant的每个叶节点.我很快意识到我可以在一条线上完成这项工作!
public Set> getLeaves() {
return getChildrenStream().flatMap(n -> n.getChildrenStream()).collect(toSet());
}
第一眼看上去很擅长,但很快就遇到StackOverflowExcepetion,树深达到10,这是我无法接受的.后来我开发了一个没有递归和流的实现(但是用我的大脑烤了),但我仍然想知道是否有办法用流做递归flatMaps,因为我发现如果不触及流内部结构就不可能这样做.它需要一个新的Op,比如RecursiveOps,或者我必须将每个步骤中的所有结果收集到Set中,然后对该Set进行操作:
Set> 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 {
// ...
/**
* Get a stream of children of the current node.
*
*/
public Stream> getChildrenStream(){
// ...
}
public Set> getLeaves() {
// main concern
}
}f