GregH
GregH

Reputation: 5459

Replacing multimap with mapping an element to a collection of elements

I am trying to map a meterId to a list of MeterBlinks that have that Id. I'm mainly confused on how to build the list up for the HashMap.put() call. Code below:

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)
}

I think the issue is that I am creating a new list each time I iterate through but I am not sure how to resolve this.

Upvotes: 2

Views: 87

Answers (2)

Brett Okken
Brett Okken

Reputation: 6306

Use the computeIfAbsent method added in jre 8:

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

Another option in java 8:

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

Upvotes: 4

user__42
user__42

Reputation: 573

I like the java8 answer, but here without java8 (without lambda expressions):

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);       
}

Upvotes: 3

Related Questions