这个问题在这里已经有了答案:
Comparator in collector in stream causes issues with type inference?
(2 个回答)
去年关闭。
以下代码不能用我的 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的类型删除系统中是否存在错误?
最佳答案
Comparator
的推断类型似乎存在问题在链式调用的情况下。
如果您事先创建 map 供应商,它可能会起作用(顺便说一句,不仅在 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 :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));
关于java - 为什么Collectors类中toMap方法的Java mapFactory参数需要指定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62040434/