Java streams: сбор вложенной коллекции
Я учусь использовать потоки Java и нуждаюсь в некоторой помощи в понимании того, как передавать вложенные коллекции и собирать результаты обратно в коллекцию.
в простом примере ниже я создал 2 ArrayLists и добавил их в ArrayList. Я хочу иметь возможность выполнять простую функцию для каждой вложенной коллекции, а затем записывать результаты в новую коллекцию. Последняя строка кода даже не компилируется. Любые объяснения будут оценены!
ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2,3));
ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(4,5,6));
ArrayList<ArrayList<Integer>> nested = new ArrayList<ArrayList<Integer>>();
nested.add(list1);
nested.add(list2);
ArrayList<ArrayList<Integer>> result = nested.stream()
.map(list -> list.add(100))
.collect(Collectors.toList());
2 ответов
проблема в том, что List#add
не возвращает List
. Вместо этого вам нужно вернуть список после сопоставления:
List<ArrayList<Integer>> result = nested.stream()
.map(list -> {
list.add(100);
return list;
})
.collect(Collectors.toList());
или вы можете пропустить, используя map
и сделать это с помощью forEach
С ArrayList
изменчиво:
nested.forEach(list -> list.add(100));
можно использовать Stream.of()
чтобы сделать это, не создавая вложенную структуру заранее.
List<ArrayList<Integer>> nestedList = Stream.of(list1, list2)
.map(list -> {list.add(100); return list;})
.collect(Collectors.toList());
и, возможно, извлечь операцию карты в отдельную функцию.