我致力于提高性能至关重要的程序的速度。目前,它无法处理大型数据集。有许多嵌套for循环,所以我认为值得尝试并行流。我可以访问高性能群集,因此可能有许多可用内核。 我有以下方法:
public MinSpecSetFamily getMinDomSpecSets() {
MinSpecSetFamily result = new MinSpecSetFamily();
ResourceType minRT = this.getFirstEssentialResourceType();
if (minRT == null || minRT.noSpecies()) {
System.out.println("Problem in getMinDomSpecSets()");
}
for (Species spec : minRT.specList) {
SpecTree minTree = this.getMinimalConstSpecTreeRootedAt(spec);
ArrayList<SpecTreeNode> leafList = minTree.getLeaves();
for (SpecTreeNode leaf : leafList) {
ArrayList<Species> sp = leaf.getAncestors();
SpecSet tmpSet = new SpecSet(sp);
result.addSpecSet(tmpSet);
}
}
return result;
}
据我所知,我可以将嵌套for循环转换为并行流,例如:
minRT.specList.parallelStream().flatMap(leaf -> leaflist.parallelStream())
但是,我找不到显示如何处理每个for循环内部动作的示例,而且我根本不相信这应该如何工作。我非常感谢有关如何转换此方法的一些帮助和解释,以便我可以将解决方案转换为程序中的其他方法。 感谢。
答案 0 :(得分:2)
这是一种做法(希望我没有拼写错误):
--select
编辑:关注Holger的评论,您应该使用MinSpecSetFamily result =
minRT.specList
.parallelStream()
.flatMap(spec -> getMinimalConstSpecTreeRootedAt(spec).getLeaves().stream())
.map(leaf -> new SpecSet(leaf.getAncestors()))
.reduce(new MinSpecSetFamily (),
(fam,set)-> {
fam.addSpecSet(set);
return fam;
},
(f1, f2) -> new MinSpecSetFamily(f1, f2));
代替collect
:
reduce