下面的代码不能用我的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的类型擦除系统中有个bug?
发布于 2020-05-27 18:34:32
在链式调用的情况下,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)));使用TreeMap::new可以在没有reverseOrder的情况下成功创建地图
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));https://stackoverflow.com/questions/62040434
复制相似问题