我的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, efgh1, 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));

10-05 23:30