下面的代码在我的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
在链式调用的情况下。
如果你事先创建了一个地图供应者,它可能会起作用(顺便说一下,不只是在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));