Invert Map with list value Map<Key, List<Value>> to Map <Value, Key> in Java 8

  • A+

I have a map kind of grouping values by key Map<String, List<Integer>>, i want to revert in order to map each value to the corresponding key

Example: I want to transform the code below

Map<String, List<Integer>> mapOfIntList = new HashMap<String, List<Integer>>();  mapOfIntList.put("UNIT", Arrays.asList(1, 2, 3, 8, 7, 0, 8, 6)); mapOfIntList.put("TEN", Arrays.asList(24, 90, 63, 87)); mapOfIntList.put("HUNDRED", Arrays.asList(645, 457, 306, 762)); mapOfIntList.put("THOUSAND", Arrays.asList(1234, 3456, 5340, 9876)); 

to another Map(Integer, String) where i can find : (1, "UNIT"), (2, "UNIT")...(24, "TEN"), (90, "TEN")...(645, "HUNDRED")...(3456, "THOUSAND")...


You can use

Map<Integer, String> mapNumberToType = mapOfIntList.entrySet().stream()     .collect(HashMap::new, (m,e)->e.getValue().forEach(v->m.put(v,e.getKey())), Map::putAll); 

You may recognize the similarity to the forEach based code of this answer within the second function passed to collect (the accumulator) function. For a sequential execution, they do basically the same, but this Stream solution supports parallel processing. That’s why it needs the other two functions, to support creating local containers and to merge them.

See also the Mutable reduction section of the documentation.


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: