用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));
}