为什么Collectors类中toMap方法的Java mapFactory参数需要指定类型?[重复]

问题描述 投票:2回答:1

下面的代码在我的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的类型清除系统有问题?

java types collectors jdk14
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));
© www.soinside.com 2019 - 2024. All rights reserved.