Java 8 Streams группируется по функции, устанавливая переменную вложенного объекта в качестве ключа и родительский объект в качестве значения - PullRequest
0 голосов
/ 18 сентября 2018

Полагаю, мой вопрос несколько ясен из названия.

У меня есть два класса: parent A and child B., и я хочу получить ответ, например Map<Integer,A>, где key is a field from child B.У меня List<A> aList извлечено из базы данных.Определения классов:

public class B {
    Integer id;
    String some;
    String some2;
}

public class A {
    Integer id;
    B someB;
    String name;
}

Я пытался как aList.streams.collect(Collectors.groupingBy(A::getSomeB)), но это не то, что я хочу.Между родителем и потомком есть только однозначное отношение, поэтому мне не нужно Map<Integer,List<A>> as the result

Я могу сделать это, зациклив aList, но если есть встроенная функция Java 8, я бы хотелиспользовать его.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Для этого даже не нужны потоки, в таком тривиальном случае:

Map<Integer, A> map = new HasMap<>();
aList.forEach(x -> map.merge(x.getSomeB().getId(), x, (oldV, newV) -> throw new AssertionError("must never happen"));
0 голосов
/ 18 сентября 2018

Возможно, вы ищете Collectors.toMap, чтобы собрать карту B.id и A в качестве объекта

Map<Integer, A> result = aList.stream().collect(
              Collectors.toMap(a -> a.getSomeB().getId(), Function.identity());
...