Java 8 Collectors.toMap SortedMap Java 8 Collectors.toMap SortedMap java java

Java 8 Collectors.toMap SortedMap


I don't think you can get much better than this:

.collect(Collectors.toMap(keyMapper, valueMapper,                        (v1,v2) ->{ throw new RuntimeException(String.format("Duplicate key for values %s and %s", v1, v2));},                        TreeMap::new));

where the throw lambda is the same as throwingMerger() but I can't directly call that since it's package private (you can of course always make your own static method for that like throwingMerger() is. )


Based on dkatzel's confirmation that there's not a nice API method, I've opted for maintaining my own custom Collectors class:

public final class StackOverflowExampleCollectors {    private StackOverflowExampleCollectors() {        throw new UnsupportedOperationException();    }    private static <T> BinaryOperator<T> throwingMerger() {        return (u, v) -> {            throw new IllegalStateException(String.format("Duplicate key %s", u));        };    }    public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,            Function<? super T, ? extends U> valueMapper, Supplier<M> mapSupplier) {        return Collectors.toMap(keyMapper, valueMapper, throwingMerger(), mapSupplier);    }}


Seems that there's no standard way to do this without defining your own throwingMerger() method or using explicit lambda. In my StreamEx library I defined the toSortedMap method which also uses my own throwingMerger().