用并行流替换嵌套for循环 - Java

时间:2018-01-31 09:13:58

标签: java parallel-processing java-8 java-stream

我致力于提高性能至关重要的程序的速度。目前,它无法处理大型数据集。有许多嵌套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循环内部动作的示例,而且我根本不相信这应该如何工作。我非常感谢有关如何转换此方法的一些帮助和解释,以便我可以将解决方案转换为程序中的其他方法。 感谢。

1 个答案:

答案 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