通过将元素映射到元素集合来替换multimap

时间:2015-07-31 13:30:12

标签: java collections

我正在尝试将meterId映射到具有该Id的MeterBlink列表。我主要想知道如何为HashMap.put()调用构建列表。代码如下:

Map<String, List<MeterBlink>> IdToMetersMap = new HashMap<>();
for (MeterBlink meterBlink : createData()) {
    List<MeterBlink> meterBlinkList = new ArrayList<>();
    meterBlinkList.add(meterBlink);
    String meterId = meterBlink.getMeterId();
    idToMetersMap.put(meterId, meterBlinkList)
}

我认为问题是我每次迭代时都会创建一个新列表,但我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:4)

使用jre 8中添加的computeIfAbsent方法:

Map<String, List<MeterBlink>> idToMetersMap = new HashMap<>();
for (MeterBlink meterBlink : createData()) {
    String meterId = meterBlink.getMeterId();
    idToMetersMap.computeIfAbsent(meterId, k -> new ArrayList<>()).add(meterBlinks);
}

java 8中的另一个选项:

Map<String, List<MeterBlink>> idToMetersMap = createData().stream()
                                     .collect(Collectors.groupingBy(MeterBlink::getMeterId));

答案 1 :(得分:3)

我喜欢java8的答案,但这里没有java8(没有lambda表达式):

Map<String, List<MeterBlink>> idToMetersMap = new HashMap<>();
for (MeterBlink meterBlink : createData()) {
    String meterId = meterBlink.getMeterId();
    List<MeterBlink> meterBlinkList = idToMetersMap.get(meterId);
    //if List doesn't exist create it and put in Map
    if (meterBlinkList == null) {
        meterBlinkList = new ArrayList<>();
        idToMetersMap.put(meterId, meterBlinksList)
    }
    meterBlinkList.add(meterBlink);       
}