В классе Collectors
нет метода toMap
, который не принимает keyMapper
. Я подозреваю, что это потому, что он может быть весьма неоднозначным, какой единственный аргумент вы передаете в карты к. Значение или ключ?
Вы легко можете написать такой сборщик самостоятельно:
class MyCollectors {
public static <K, U> Collector<K, ?, Map<K,U>> toMapWithValueWrapper(Function<? super K, ? extends U> valueMapper) {
return Collectors.toMap(Function.identity(), valueMapper);
}
}
Обратите внимание, что подпись немного отличается от Collectors.toMap
. Есть только 2 общих параметра. Оригинал Collectors.toMap
имеет 3 - T
(тип, который мы собираем), K
(тип ключа) и U
(тип значения). Поскольку вы используете функцию идентификации для ключа, ключ всегда будет иметь тот же тип, что и тип, который мы собираем, поэтому T == K
. Следовательно, мы можем устранить T
.
Edit:
Как предложил Хольгер в комментариях, нам не нужно форсировать T == K
, потому что T
может быть подклассом K
, и вы все равно можете использовать функцию идентификации для отображения с T
на K
, Поэтому вы можете использовать это:
class MyCollectors {
public static <T extends K, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends U> valueMapper) {
return Collectors.toMap(Function.identity(), valueMapper);
}
}
если вы хотите разрешить собирать на карту, тип ключа которой является суперклассом типа, который вы собираете.