How to Convert Stream to Specific Map Implementation in Java
How can we convert a Stream to a TreeMap or LinkedHashMap or any Map implementation in Java?
Suppose we have a Stream of integers.
Stream<Integer> stream = Arrays.asList(1, 2).stream();
Convert Stream to Map
We can use Stream.collect() and Collectors.toMap() to collect stream elements into a map.
Map<Integer, Integer> map = stream.collect(
Collectors.toMap(
num -> getKey(num),
num -> getValue(num)
)
);
If we’re collecting map entries into another map, we can use the static Map.Entry::getKey and Map.Entry::getValue functions.
Map<Integer, Integer> map = stream.collect(
Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue
)
);
Convert Stream to TreeMap
To convert to a specific map implementation, we’ll need to specify the mergeFunction and mapSupplier, the third and fourth arguments, respectively.
Map<Integer, Integer> map = stream.collect(
Collectors.toMap(
num -> getKey(num),
num -> getValue(num),
(oldValue, newValue) -> newValue,
TreeMap::new
)
);
The (oldValue, newValue) -> newValue allows the collector to resolve duplicate keys, and in this case, returns the value of the second key.
The mapSupplier provides a new, empty Map instance into which the results will be inserted.
Convert Stream to LinkedHashMap
Converting to other implementations is just as easy.
Map<Integer, Integer> map = stream.collect(
Collectors.toMap(
num -> getKey(num),
num -> getValue(num),
(oldValue, newValue) -> newValue,
LinkedHashMap::new
)
);
General-purpose map implementations include
HashMap,TreeMap, andLinkedHashMap. Special-purpose map implementations includeEnumMap,WeakHashMap, andIdentityHashMap. There are also concurrent map implementations:ConcurrentMapandConcurrentHashMap.