Java 8 Streams Java Java API
The static overloaded methods, Collectors.toConcurrentMap() return a Collector which produces a new ConcurrentMap, populated with keys per provided keyMapper function and values per provided valueMap function.
<T,K,U> Collector<T,?,ConcurrentMap<K,U>> toConcurrentMap(
Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper)
<T,K,U> Collector<T,?,ConcurrentMap<K,U>> toConcurrentMap(
Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
<T,K,U,M extends ConcurrentMap<K,U>> Collector<T,?,M> toConcurrentMap(
Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier)
Parameters
keyMapper: A mapping function to produce the map keys for each input stream element.
valueMapper: A mapping function to produce the map values for each input stream element.
mergeFunction: A binary operator which is to resolve collisions between values associated with the same key. The inputs to this function are the values which belong to the same key.
mapSupplier: A function which provides a new instance of the desired implementation of the ConcurrentMap.
Examples
package com.logicbig.example.collectors;
import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; import java.util.stream.Stream;
public class ToConcurrentMapExample { public static void main (String[] args) { Stream<String> s = Stream.of("apple", "banana", "orange"); ConcurrentMap<Character, String> m = s.collect( Collectors.toConcurrentMap(s1 -> s1.charAt(0), String::toUpperCase)); System.out.println(m); } }
Output{a=APPLE, b=BANANA, o=ORANGE}
Original Post
The method Collectors.toConcurrentMap(keyMapper, valueMapper) will throw IllegalStateException if there are duplicate keys as provided by keyMapper function. package com.logicbig.example.collectors;
import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; import java.util.stream.Stream;
public class ToConcurrentMapExample1 { public static void main (String[] args) { Stream<String> s = Stream.of("apple", "banana", "apricot", "orange"); ConcurrentMap<Character, String> m = s.collect( Collectors.toConcurrentMap(s1 -> s1.charAt(0), String::toUpperCase)); System.out.println(m); } }
OutputCaused by: java.lang.IllegalStateException: Duplicate key APPLE at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java.util.concurrent.ConcurrentHashMap.merge(ConcurrentHashMap.java:1990) at java.util.stream.Collectors.lambda$toConcurrentMap$59(Collectors.java:1472) at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at com.logicbig.example.collectors.ToConcurrentMapExample1.main(ToConcurrentMapExample1.java:17) ... 6 more
Original Post
package com.logicbig.example.collectors;
import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream;
public class ToConcurrentMapExample2 { public static void main (String[] args) { Stream<String> s = Stream.of("apple", "banana", "apricot", "orange"); Map<Character, String> m = s.collect( Collectors.toConcurrentMap(s1 -> s1.charAt(0), String::toUpperCase, (s1, s2) -> s1 + "|" + s2)); System.out.println(m); } }
Output{a=APPLE|APRICOT, b=BANANA, o=ORANGE}
Original Post
package com.logicbig.example.collectors;
import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import java.util.stream.Stream;
public class ToConcurrentMapExample3 { public static void main (String[] args) { Stream<String> s = Stream.of("apple", "banana", "apricot", "orange"); ConcurrentHashMap<Character, String> m = s.collect( Collectors.toConcurrentMap(s1 -> s1.charAt(0), String::toUpperCase, (s1, s2) -> s1 + "|" + s2, ConcurrentHashMap::new)); System.out.println(m); } }
Output{a=APPLE|APRICOT, b=BANANA, o=ORANGE}
Original Post
|