Как это сделать с лямбдами? Это не работает
Здесь вы никогда не вызываете операцию завершения, поэтому поток никогда не используется. :
nodes.entrySet().stream().flatMap(e -> e.getValue().entrySet().stream()).map(e2 -> result.add(e2.getValue()))
Добавьте любую терминальную операцию, например count()
, и вы увидите работающий поток.
Не забывайте, что потоки ленивы, и поэтому вычисления эффективно выполняются только тогда, когда вызывается операция терминала.
Таким образом, вы догадываетесь, что ваш путь не является правильным способом сделать что-то с Stream.
Вам не нужно использовать List
как переменную, которую вы будете заполнять в потоке. Потоки предназначены для сбора по мере того, как они производят результат, и сбор в List
, наконец, является терминальной операцией, которая пропущена в вашем исходном коде.
Кроме того, в качестве дополнительного примечания вы должны просто передавать значения каждого уровня карты вместо записей, поскольку вы никогда не используете ключи.
Вот код для каждого шага фактического типа возврата:
List<List<Integer>> result =
nodes.values() // Collection<Map<Integer, List<Integer>>>
.stream() // Stream<Map<Integer, List<Integer>>>
.flatMap(m -> m.values() // Collection<List<Integer>>>
.stream()) // Stream<List<Integer>>>
// flatMap() prevents Stream<Stream<...>>.
// Indeed we get just Stream<List...>>
.collect(Collectors.toList());