Пересечение между вложенными списками потоков Java 8 - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть вложенный список Long.например:

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

Есть ли способ использовать потоки для создания нового списка элементов, присутствующих во всех списках:

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вот (менее сжатая) 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;
                                  });
0 голосов
/ 18 февраля 2019

Существует довольно краткое решение без потока:

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); 
...