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
的类型推断存在问题。如果您事先创建地图提供者,可能会起作用(顺便说一句,不仅在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));