我的List
包含一个VO数据,像这样说DataVO
:
DataVO 1: 1, abcd, efgh
DataVO 2: 1, pqrs, wxyz
DataVO 3: 2, hello, letsgo
我想创建一个
Map
,将key作为第一个元素,并将List
作为值。Map<Integer, List<DataVO>> myDataMap
因此内容将如下所示:
myDataMap.get(1)
是包含1, abcd, efgh
和1, pqrs, wxyz
的列表myDataMap.get(2)
是包含2, hello, letsgo
的列表现在,我正在这样做:
Map<Integer, List<DataVO>> myDataMap = new HashMap<>();
dataVoList.forEach(dataVo -> {
int id = dataVo.getId();
if (myDataMap.containsKey(id)) {
myDataMap.get(id).add(dataVo);
} else {
myDataMap.put(id, new ArrayList<>(Arrays.asList(dataVo)));
}
});
如何优化呢?
我很累使用流,像这样:
dataVoList.stream().collect(toMap(Data::id, ....));
但是它给出了重复的键错误。
如果我使用merge属性,那么它只会保留一个元素。 (如here所述)
请提出建议。
最佳答案
使用groupingBy
:
Map<Integer, List<DataVO>> myDataMap =
dataVoList.stream()
.collect(Collectors.groupingBy(DataVO::getId));