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

и, возможно, извлечь операцию карты в отдельную функцию.