Java Группировка потоков по объектам с родительскими и дочерними отношениями - PullRequest
0 голосов
/ 22 января 2020

У меня есть такой класс ...

class Data { int id, int parent}

И список таких объектов ...

List<Data> dataList = new ArrayList();
dataList.add(new Data(1,0));
dataList.add(new Data(2,1));
dataList.add(new Data(3,1));
dataList.add(new Data(4,2));
dataList.add(new Data(5,2));

Я хочу использовать потоковый API для сбора моего перечислите в

Map<Data, List<Data>>

, где ключом карты является родитель, а значениями - дети.

Любая помощь будет принята с благодарностью. Спасибо

1 Ответ

5 голосов
/ 22 января 2020

Collectors.groupingBy() может дать вам Map<Integer, List<Data>>, где ключом является родительский идентификатор:

Map<Integer, List<Data>> map =
    dataList.stream()
            .collect(Collectors.groupingBy(Data::getParent));

Если вы хотите, чтобы ключ был экземпляром Data, который соответствует родительскому идентификатору, вы Сначала необходимо подготовить сопоставление идентификаторов соответствующим Data экземплярам:

Map<Integer, Data> ids = dataList.stream()
                                 .collect(Collectors.toMap(Data::getID, Function.identity()));

, а затем:

Map<Data, List<Data>> map =
    dataList.stream()
            .collect(Collectors.groupingBy(d -> ids.get(d.getParent())));
...