这是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());}
任何想法都将受到赞赏。
答案 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;