我有一个数据列表,如下所示:
List<Data> data = new ArrayList<Data>();
data.add(new Data("d1", "option1"));
data.add(new Data("d2", "option1"));
data.add(new Data("d1", "option2"));
data.add(new Data("d3", "option1"));
data.add(new Data("d3", "option2"));
data.add(new Data("d3", "option3"));
结构如下:
class Data {
private String name;
private String option;
private List<String> options = new ArrayList<>();
public Data(String name, String option) {
this.name = name;
this.option = option;
}
public void addOption(String option) {
options.add(option);
}
}
如何根据名称及其选项将项目分组到一个新数组中,
[
"d1": {
"name": "d1",
"options": ["option1", "option2"]
},
"d2": {
"name": "d2",
"options": ["option1"]
},
"d3": {
"name": "d3",
"options": ["option1", "option2", "option3"]
}
]
最佳答案
您可以使用Collectors.toMap
收集器:
Map<String,Data>
grouped = data.stream()
.collect(Collectors.toMap(Data::getName,
d -> new Data(d.getName(),d.getOption()),
(d1,d2) -> {d1.addOptions(d2.getOptions()); return d1;});
这将需要更改
Data
构造函数,以将传递的选项添加到选项List
中,并添加一个addOptions
方法来接收选项列表,并将所有选项都添加到当前实例的选项List
中。