Потоки Java отображают список свойств класса на сплющенную карту - PullRequest
3 голосов
/ 13 марта 2019

Как мы можем превратить Список в сторону Карты > наиболее оптимальным способом, используя потоки Java.

Осторожно: свойство A НЕ уникально

//pseudo-code
class Foo
    propertyA //not unique
    List<propertyB>

Пока у меня есть следующее:

fooList.stream()
       .collect(Collectors.groupingBy(Foo::propertyA, 
                    Collectors.mapping(Foo::propertyB, Collectors.toList())))

В результате получается Map<propretyA, List<List<propretyB>>>, который еще не сплющен по своему значению.

Ответы [ 3 ]

5 голосов
/ 13 марта 2019

Вы можете использовать Java 9+ Collectors.flatMapping:

Map<propretyA, List<propretyB>> result = fooList.stream()
       .collect(Collectors.groupingBy(Foo::propertyA, 
                Collectors.flatMapping(foo -> foo.propertyB().stream(), 
                                       Collectors.toList())));

Другой способ (Java8 +) - использовать Collectors.toMap, как в этот ответ .

И еще один способ Java8 + - просто не использовать потоки, а вместо этого использовать Map.computeIfAbsent:

Map<propretyA, List<propretyB>> result = new LinkedHashMap<>();
fooList.forEach(foo -> result.computeIfAbsent(foo.propertyA(), k -> new ArrayList<>())
                             .addAll(foo.propertyB()));
4 голосов
/ 13 марта 2019

Это должно сделать это:

    fooList.stream()
           .collect(Collectors.toMap(Foo::getPropertyA, Foo::getPropertyBList, (l1, l2) -> {
               l1.addAll(l2);
               return l1;
           }));
1 голос
/ 13 марта 2019

Вы можете использовать Collectors.toMap с функцией слияния, где вы должны решить, какой List<propertyB> должен использоваться при дублировании ключей:

Map<propertyA, List<propertyB>> collect = list.stream()
        .collect(Collectors.toMap(Foo::getPropertyA, Foo::getList, (l1, l2) -> ???));

В противном случае вы можете получить IllegalStateException.Начиная с javadoc :

Если сопоставленные ключи содержат дубликаты (согласно Object.equals (Object)), исключение IllegalStateException вызывается при выполнении операции сбора.

Вам решать, как реализовать функцию слияния, но обычно вы просто хотите вернуть объединение 2 списков, например: l1.addAll(l2); return l1;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...