Java 8 Collectors.toMap SortedMap
Java 8 람다를 사용 Collectors
toMap
하고 있으며 SortedMap
. 내가 생각 해낼 수있는 최선의 Collectors
toMap
방법은 더미 mergeFunction
와 mapSupplier
같은 다음 메서드 를 호출하는 것 TreeMap::new
입니다.
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,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier) {
BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element),
valueMapper.apply(element), mergeFunction);
return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
다음과 같이 throwingMerger()
기본 toMap
구현과 동일한 방식으로 원하는대로 병합 함수를 전달하고 싶지 않습니다 .
public static <T, K, U>
Collector<T, ?, Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper) {
return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
Collectors
반환하는 데 사용하는 가장 좋은 방법은 무엇입니까 SortedMap
?
나는 당신이 이것보다 훨씬 나아질 수 있다고 생각하지 않습니다.
.collect(Collectors.toMap(keyMapper, valueMapper,
(v1,v2) ->{ throw new RuntimeException(String.format("Duplicate key for values %s and %s", v1, v2));},
TreeMap::new));
여기서 throw
람다는 동일 throwingMerger()
하지만 패키지 비공개이기 때문에 직접 호출 할 수 없습니다 (물론 항상 고유 한 정적 메서드를 만들 수 있습니다 throwingMerger()
.)
좋은 API 메서드가 없다는 dkatzel의 확인에 따라, 저는 제 고유 한 Collectors 클래스를 유지하기로 선택했습니다.
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);
}
}
자체 throwingMerger()
메서드 를 정의 하거나 명시 적 람다를 사용 하지 않고이를 수행하는 표준 방법이없는 것 같습니다 . 내 StreamEx 라이브러리에서 나는 정의 toSortedMap
도 방법을 사용하여 내 자신을 throwingMerger()
.
이를 수행 할 수있는 또 다른 방법은 Collectors.toMap ()이 반환 할 맵을 반환하도록 허용 한 다음이를 새 TreeMap <> ()에 전달하는 것입니다.
주의 할 점은 "hashCode () + equals ()"및 "compareTo"가 일관된 경우에만 작동한다는 것입니다. 일관성이 없으면 HashMap이 TreeMap과 다른 키 세트를 제거하게됩니다.
구아바 라이브러리를 사용하는 경우 다음을 사용할 수 있습니다.
.collect(ImmutableSortedMap.toImmutableSortedMap(comparator, keyMapper, valueMapper));
The resulting map will be a SortedMap
and also immutable.
참고URL : https://stackoverflow.com/questions/31004899/java-8-collectors-tomap-sortedmap
'Programing' 카테고리의 다른 글
Visual Studio에서 Git을 사용하는 "충돌로 인해 체크 아웃 방지"오류 (0) | 2020.11.25 |
---|---|
Dagger and Butter Knife vs. Android 주석 (0) | 2020.11.25 |
NUnit 3.0 및 Assert.Throws (0) | 2020.11.25 |
jQuery를 사용하여 ASP.NET 웹 서비스를 호출하는 방법은 무엇입니까? (0) | 2020.11.25 |
Java 메서드 주석은 메서드 재정의와 함께 어떻게 작동합니까? (0) | 2020.11.25 |