4

以下代码无法与我的 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 的类型擦除系统中存在错误?

4

1 回答 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));
于 2020-05-27T10:34:32.493 回答