Невозможно ввести переменные типа для Collectors.toMap

Я EnumMaprying для создания, который просто сопоставляет константы entoMapm с их соответствующими ординалами. Я решил, что смогу сделать это лаконично, так:private static Map<Rank, Integer> defaultRankOrdering = new EnumMap<>( Arrays.stream(Rank.values()).collect( Collectors.toMap(Function::identity, e -> e.ordinal())));

общественный статический < T , K , U > Коллектор < T , ? , Карта < K , U >> toMap ( функция <? Супер T , ? Расширяет K > keyMapper , функция <? Супер T , ? Расширяет U > valueMapper ) набран аккуратно ">        
                                                            T

Однако компилятор говорит, что он не может вывести ни одну из переменных типа Rank. Я не понимаю, почему, учитывая, что для двухфакторной сигнатуры Arrays.stream(Rank.values()):

Stream<Rank>

Tследует сделать вывод, что K, так как Rankэто Function.identity, Kтакже следует сделать вывод, что Function<T, T>, как и Uвозвращает Integer, и Uследует сделать вывод, что , Enum.ordinalтак как тип возврата intявляется int, который должен быть в штучной упаковке , чтобы Integerв данном случае.

Любая помощь будет принята с благодарностью.

java | лямбда | java-8 | java-stream | сборщики |

4

Ответов: 2


Вы хотите Function.identity(), а не Function::identity:

private static Map<Rank, Integer> defaultRankOrdering = new EnumMap<>(
    Arrays.stream(Rank.values()).collect(
        Collectors.toMap(Function.identity(), e -> e.ordinal())));

Тип Function::identityis Supplier<Function<T,T>>, так как это ссылка метода для метода, который ничего не принимает и возвращает a Function<T,T>.

То, что вам нужно для вашей функции сопоставления ключей, - это a Function<T,T>, которая возвращается простым вызовом метода Function.identity().


Даже если @Eran указал на вашу проблему, но я думаю, что вам нужен этот фрагмент кода, поэтому запишите его в свой ответ:

static Map<Rank, Integer>
defaultRankOrdering = Arrays.stream(Rank.values()).collect(toMap(
        Function.identity(),
        Enum::ordinal,
        (v1, v2) -> v1, // it'is never be used, only support for create an EnumMap
        () -> new EnumMap<>(Rank.class)
));

java | лямбда | java-8 | java-stream | сборщики |

Ещё вопросы: | 10022954.php | | 45004499.php | | 45008173.php | | 45014827.php | | 45012942.php |

Яндекс.Метрика