为什么Collectors类中的toMap方法的Java mapFactory参数需要指定类型? [重复]

问题描述 投票:5回答:1
以下代码无法与我的JDK14一起编译:

Map<Integer, String> map = Arrays.asList("this", "is", "just", "an", "example").stream() .collect(Collectors.toMap(w -> w.length(), w -> w, (existing, replacement) -> replacement, () -> new TreeMap<>(Comparator.reverseOrder())));

而如果我为TreeMap的构造函数指定类型,则可以正常工作:

Map<Integer, String> map4 = Arrays.asList("this", "is", "just", "an", "example").stream() .collect(Collectors.toMap(w -> w.length(), w -> w, (existing, replacement) -> replacement, () -> new TreeMap<Integer, String>(Comparator.reverseOrder())));

我是否缺少某些内容,或者JDK14的类型擦除系统中是否存在错误?
java types java-stream collectors jdk14
1个回答
0
投票
似乎在链接呼叫的情况下,Comparator的类型推断存在问题。

如果您事先创建地图提供者,可能会起作用(顺便说一句,不仅在JDK14中如此:]

Supplier<Map<Integer, String>> supplier = () -> new TreeMap<>(Comparator.reverseOrder()); Map<Integer, String> mapWithSupplier = Arrays.asList("this", "is", "just", "an", "example").stream() .collect(Collectors.toMap(w -> w.length(), w -> w, (existing, replacement) -> replacement, supplier));

如果使用Collections.reverseOrder(),将完全不会遇到此问题:

Map<Integer, String> mapCollectionReversed = Arrays.asList("this", "is", "just", "an", "example").stream() .collect(Collectors.toMap(w -> w.length(), w -> w, (existing, replacement) -> replacement, () -> new TreeMap<>(Collections.reverseOrder())));

或至少预先创建了一个比较器:

Comparator<Integer> comparator = Comparator.reverseOrder(); Map<Integer, String> mapWithComparator = Arrays.asList("this", "is", "just", "an", "example").stream() .collect(Collectors.toMap(w -> w.length(), w -> w, (existing, replacement) -> replacement, () -> new TreeMap<>(comparator)));


并且如果没有reverseOrder,可以使用TreeMap::new成功创建地图:

Map<Integer, String> map = Arrays.asList("this", "is", "just", "an", "example").stream() .collect(Collectors.toMap(w -> w.length(), w -> w, (existing, replacement) -> replacement, TreeMap::new));

© www.soinside.com 2019 - 2024. All rights reserved.