java - 为什么Collectors类中toMap方法的Java mapFactory参数需要指定类型?

标签 java types java-stream collectors java-14

这个问题在这里已经有了答案:





Comparator in collector in stream causes issues with type inference?

(2 个回答)


去年关闭。




以下代码不能用我的 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 的推断类型似乎存在问题在链式调用的情况下。

如果您事先创建 map 供应商,它可能会起作用(顺便说一句,不仅在 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 :
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));

关于java - 为什么Collectors类中toMap方法的Java mapFactory参数需要指定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62040434/

相关文章:

具有 getter 和 setter 方法的 Java 对象

java - 将增强循环转换为 Java 8 Streams,过滤器 - forEach

java - 从 Nullable 对象创建 Stream 的惯用方法

java - 带有 minimizeJar 的 Maven Shade 插件

java - 我尝试连接数据库时出现错误

java - 如何访问 JEditorPane 中的小部件?

PHP 和 Jquery 的 json

c++ - Opencv 数据类型定义

go - 在NewX函数上返回指针背后有充分的理由吗?

Java 8 Stream api,用于选择按每个部门的工资排序的前 3 名员工姓名