嵌套列表之间的交集Java 8流

时间:2019-02-18 11:40:05

标签: java java-8 nested java-stream

我有一个Long的嵌套列表。例如:

List<List<Long>> ids = [[1,2,3],[1,2,3,4],[2,3]];

有没有一种方法可以使用流创建所有列表中存在的项目的新列表:

List<Long> result = [2,3];

2 个答案:

答案 0 :(得分:12)

有没有流的简洁解决方案:

List<Long> result = new ArrayList<>(ids.get(0));
ids.forEach(result::retainAll);

System.out.println(result);

更新:如@ernest_k的注释中所提到的,以避免不必要的retainAll()调用,您可以在以下时间获得子列表:

ids.subList(1, ids.size()).forEach(result::retainAll); 

答案 1 :(得分:4)

以下是Stream的(不太简洁)的reduce版本:

List<Long> intersect = ids.stream()
                          .reduce(ids.get(0),
                                  (l1,l2) -> {
                                      l1.retainAll(l2);
                                      return l1;
                                  });

或者(如果我们想避免对原始List进行突变):

List<Long> intersect = ids.stream()
                          .reduce(new ArrayList<>(ids.get(0)),
                                  (l1,l2) -> {
                                      l1.retainAll(l2);
                                      return l1;
                                  });