具有父子关系的对象上的 Java 流分组依据

DMc*_*Mcg 0 java grouping java-stream

我有一个这样的班...

class Data { int id, int parent}
Run Code Online (Sandbox Code Playgroud)

还有像这样的对象列表......

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));
Run Code Online (Sandbox Code Playgroud)

我想使用流媒体 API 将我的列表收集到一个

Map<Data, List<Data>>
Run Code Online (Sandbox Code Playgroud)

其中地图的键是父级,值是子级。

任何帮助将不胜感激。谢谢

Era*_*ran 6

Collectors.groupingBy()可以给你一个Map<Integer, List<Data>>关键是父ID的地方:

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

如果您希望 key 是Data与父 ID 对应的实例,则需要先准备 ID 到相应Data实例的映射:

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

进而:

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