性能改进在Java 8中查找两个嵌套列表之间的交集

时间:2015-10-20 17:39:03

标签: java performance list java-8

这是Java 8中的一段代码,它找到两个不同嵌套列表之间的交集。当我执行此代码时,它会对我的程序产生巨大的性能影响。我试图找出代码的哪一部分导致这种严重的性能打击。

private static List<List<Integer>> findIntersection(List<List<Integer>> processlist1,List<List<Integer>> processlist2) {
        List<List<Integer>> intersect = processlist1.stream().flatMap(sl1 -> processlist2.stream().map(sl2 -> {
        List<Integer> lout = new ArrayList<>();
        lout.addAll(sl1);
        lout.retainAll(sl2);
        return lout;
    })).filter(l -> l.size() > 0).distinct().collect(Collectors.toList());}

任何想法都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

您可以通过将交叉产品的一侧转换为retainAll的流来避免HashSet的二次复杂度:

List<List<Integer>> intersect = processList2.stream()
        .map(HashSet::new)
        .flatMap(set -> processList1.stream()
                .map(list -> list.stream()
                        .filter(set::contains)
                        .collect(toList())
                )
        )
        .filter(x -> !x.isEmpty())
        .distinct()
        .collect(toList());

以上假设

import static java.util.stream.Collectors.toList;