У меня есть вложенный список Long.например:
Long
List<List<Long>> ids = [[1,2,3],[1,2,3,4],[2,3]];
Есть ли способ использовать потоки для создания нового списка элементов, присутствующих во всех списках:
List<Long> result = [2,3];
Вот (менее сжатая) Stream версия с использованием reduce:
Stream
reduce
List<Long> intersect = ids.stream() .reduce(ids.get(0), (l1,l2) -> { l1.retainAll(l2); return l1; });
или (если мы хотим избежать изменения оригинала List с):
List
List<Long> intersect = ids.stream() .reduce(new ArrayList<>(ids.get(0)), (l1,l2) -> { l1.retainAll(l2); return l1; });
Существует довольно краткое решение без потока:
List<Long> result = new ArrayList<>(ids.get(0)); ids.forEach(result::retainAll); System.out.println(result);
Обновление : как было упомянуто в комментариях @ernest_k, чтобы избежать лишнего вызова retainAll(), вы можете получить подсписокдо:
retainAll()
ids.subList(1, ids.size()).forEach(result::retainAll);