package org.cloudfoundry.identity.uaa.util; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; public class MapCollector<T,K,V> implements Collector<T, HashMap<K, V>, HashMap<K, V>> { private final Function<T, K> keyMapper; private final Function<T, V> valueMapper; public MapCollector(Function<T, K> keyMapper, Function<T, V> valueMapper) { this.keyMapper = keyMapper; this.valueMapper = valueMapper; } @Override public Supplier<HashMap<K, V>> supplier() { return HashMap::new; } @Override public BiConsumer<HashMap<K, V>, T> accumulator() { return (m, item) -> m.put(keyMapper.apply(item), valueMapper.apply(item)); } @Override public BinaryOperator<HashMap<K, V>> combiner() { return (left, right) -> { throw new IllegalStateException(String.format("Duplicate key %s", left)); }; } @Override public Function<HashMap<K, V>, HashMap<K, V>> finisher() { return m -> m; } @Override public Set<Characteristics> characteristics() { return Collections.singleton(Characteristics.UNORDERED); } }