Isa*_*old 5 java lambda java-8 java-stream collectors
我正在尝试创建一个EnumMap简单地将枚举的常量映射到各自的序数.我想我可以如此简洁地这样做:
private static Map<Rank, Integer> defaultRankOrdering = new EnumMap<>(
Arrays.stream(Rank.values()).collect(
Collectors.toMap(Function::identity, e -> e.ordinal())));
Run Code Online (Sandbox Code Playgroud)
但是,编译器说它无法推断出任何类型变量toMap.考虑到这一点,我不明白为什么,根据以下两个参数的签名toMap:
public static <T, K ,U> Collector<T, ? ,Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper)
Run Code Online (Sandbox Code Playgroud)
T应该推断为Rank,作为Arrays.stream(Rank.values())a Stream<Rank>,K也应该推断为Rank,作为Function.identity返回a Function<T, T>,并且U应该推断为Integer因为返回类型Enum.ordinal是int,Integer在这种情况下应该加框.
任何帮助将不胜感激.
你想要的Function.identity()不是Function::identity:
private static Map<Rank, Integer> defaultRankOrdering = new EnumMap<>(
Arrays.stream(Rank.values()).collect(
Collectors.toMap(Function.identity(), e -> e.ordinal())));
Run Code Online (Sandbox Code Playgroud)
类型Function::identity是Supplier<Function<T,T>>,因为它是一个方法参考,一个方法什么都不需要,并返回一个Function<T,T>.
键映射函数需要的是a Function<T,T>,只需调用该方法即可返回Function.identity().