Java 如何递归地平面映射流?

Java 如何递归地平面映射流?,java,recursion,java-8,java-stream,flatmap,Java,Recursion,Java 8,Java Stream,Flatmap,我被要求检索每个作为树节点描述的叶节点。我很快就有了这样的想法,我可以在一条线上完成这项工作 public Set<TreeNode<E>> getLeaves() { return getChildrenStream().flatMap(n -> n.getChildrenStream()).collect(toSet()); } 看起来不太好。溪流应该是一条管道。其结果和中间结果在添加终端op之前不会计算。上述做法显然违反了这一原则。平行化也不像溪流那

我被要求检索每个作为树节点描述的叶节点。我很快就有了这样的想法,我可以在一条线上完成这项工作

public Set<TreeNode<E>> getLeaves() {
    return getChildrenStream().flatMap(n -> n.getChildrenStream()).collect(toSet());
}
看起来不太好。溪流应该是一条管道。其结果和中间结果在添加终端op之前不会计算。上述做法显然违反了这一原则。平行化也不像溪流那么容易。我可以在不手动计算所有中间结果的情况下递归生成平面图吗

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
公共类树节点{
// ...
/**
*获取当前节点的子节点流。
*
*/
公共流getChildrenStream(){
// ...
}
公共集getLeaves(){
//主要关注点
}
}f

不完全确定这是否是您感兴趣的内容:

public static Set<TreeNode<String>> getAllLeaves(TreeNode<String> treeNode) {
    final Stream<TreeNode<String>> childrenStream = treeNode.getChildrenStream();
    if (childrenStream == null) {
        return new HashSet<>();
    }

    Set<TreeNode<String>> ownLeaves = treeNode.getLeaves();
    ownLeaves.addAll(childrenStream.flatMap(stringTreeNode -> getAllLeaves(stringTreeNode).parallelStream())
            .collect(Collectors.toSet()));

    return ownLeaves;
}
公共静态集getAllLeaves(TreeNode TreeNode){
final Stream childrenStream=treeNode.getChildrenStream();
if(childrenStream==null){
返回新的HashSet();
}
设置ownLeaves=treeNode.getLeaves();
addAll(childrenStream.flatMap(stringTreeNode->getAllLeaves(stringTreeNode.parallelStream())
.collect(Collectors.toSet());
归还自己的叶子;
}

开箱即用,我发现这种方法有一些不便之处。它确实为最后一次迭代返回了一个空集,并且它正在创建流,正如它在
flatMap
中所做的那样。然而,我相信这正是您所寻找的,因为您正在考虑使用
flatMap
,您希望从中获得一个递归创建的连接集,而该连接集最初没有创建流。顺便说一句,我尝试了-1000级,它仍然运行得很快,没有问题。

这看起来与另一个问题非常相关。它回答了你的问题吗?(这不是一个简单的问题)@Tunaki谢谢这就是我要找的。但是,没有使用该关键字进行搜索。
public static Set<TreeNode<String>> getAllLeaves(TreeNode<String> treeNode) {
    final Stream<TreeNode<String>> childrenStream = treeNode.getChildrenStream();
    if (childrenStream == null) {
        return new HashSet<>();
    }

    Set<TreeNode<String>> ownLeaves = treeNode.getLeaves();
    ownLeaves.addAll(childrenStream.flatMap(stringTreeNode -> getAllLeaves(stringTreeNode).parallelStream())
            .collect(Collectors.toSet()));

    return ownLeaves;
}