Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用parallelStream-Java替换for循环_Java_Recursion_Parallel Processing_Java 8_Java Stream - Fatal编程技术网

用parallelStream-Java替换for循环

用parallelStream-Java替换for循环,java,recursion,parallel-processing,java-8,java-stream,Java,Recursion,Parallel Processing,Java 8,Java Stream,我有以下递归调用自身的方法: public ArrayList<SpecTreeNode> getLeavesBelow() { ArrayList<SpecTreeNode> result = new ArrayList<>(); if (isLeaf()) { result.add(this); } for (SpecTreeNode stn : chList)

我有以下递归调用自身的方法:

public ArrayList<SpecTreeNode> getLeavesBelow()
   {
      ArrayList<SpecTreeNode> result = new ArrayList<>();
      if (isLeaf())
      {
         result.add(this);
      }

      for (SpecTreeNode stn : chList)
      {
         result.addAll(stn.getLeavesBelow());
      }
      return result;
   }

非常感谢您的帮助。

就这样,对吗?我错过什么了吗

result.addAll(
    chList.parallelStream()
         .map(SpecTreeNode::getLeavesBelow)
         .flatMap(Collection::stream)
         .collect(Collectors.toList())
);

与您的问题无关,但因为您正在寻求性能改进:通过为ArrayList指定初始大小以避免多次重新分配,您可能会看到一些好处


如果无法预测大小,则
LinkedList
可能是更好的数据结构,因为此处所做的一切都是不断地追加到列表的末尾。但是,如果您以后需要随机访问此列表的元素,则可能不需要。

我将通过使递归方法返回节点的
流而不是
列表,然后过滤以仅保留叶子,最后收集到列表:

public List<SpecTreeNode> getLeavesBelow() {
    return nodesBelow(this)
        .parallel()
        .filter(Node::isLeaf)
        .collect(Collectors.toList());
}

private Stream<SpecTreeNode> nodesBelow(SpecTreeNode node) {
    return Stream.concat(
               Stream.of(node), 
               node.chList.stream()
                      .flatMap(this::leavesBelow));
}
public List getLeavesBelow(){
返回下面的节点(此)
.parallel()
.filter(节点::isLeaf)
.collect(Collectors.toList());
}
下面的专用流节点(SpectreNode节点){
返回流.concat(
(节点)的流,
node.chList.stream()
.flatMap(this::levesblow));
}

您在寻找递归流,不是吗?在这种情况下,
flatMap
可能是一种方法。举个例子:我不认为你遗漏了什么。我今天刚从溪流开始。但是,该代码给了我编译错误:没有为addAll(List)方法Collection.addAll找到合适的方法(Collection@SteveW啊,要从
转到
,您需要一个额外的平面图。我已经编辑了我的答案。谢谢。这很有效,但它的速度比原来的for循环慢:(为什么要将流包装在result.addAll中?您不只是从已经创建的列表中创建一个新列表吗?
list result=chList.parallelStream().map(spectreNode::getLeavesBelow).flatMap(Collection::stream).collect(Collectors.toList())
更好吗?但不确定它是否比原始代码快。
LinkedList
不太可能有任何帮助。
public List<SpecTreeNode> getLeavesBelow() {
    return nodesBelow(this)
        .parallel()
        .filter(Node::isLeaf)
        .collect(Collectors.toList());
}

private Stream<SpecTreeNode> nodesBelow(SpecTreeNode node) {
    return Stream.concat(
               Stream.of(node), 
               node.chList.stream()
                      .flatMap(this::leavesBelow));
}