gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:11:08 30 4
gpt4 key购买 nike

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





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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com