gpt4 book ai didi

java - Collectors.toConcurrentMap 和通过 Collectors.toMap 供应商选项将 Map 转换为 ConcurrentHashMap 之间有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:44:20 50 4
gpt4 key购买 nike

我想通过 Java 8 StreamCollector 接口(interface)将 Map 转换为 ConcurrentHashMap,然后是我可以使用的两个选项。

第一个:

Map<Integer, String> mb = persons.stream()
.collect(Collectors.toMap(
p -> p.age,
p -> p.name,
(name1, name2) -> name1+";"+name2,
ConcurrentHashMap::new));

第二个:

Map<Integer, String> mb1 = persons.stream()
.collect(Collectors.toConcurrentMap(
p -> p.age,
p -> p.name));

哪个是更好的选择?我应该在什么时候使用每个选项?

最佳答案

它们在处理并行流时是有区别的。

toMap -> 是非并发收集器

toConcurrentMap -> 是一个并发收集器(这个从它们的特性就可以看出)。

区别在于toMap会创建多个中间结果,然后合并在一起(这样的Collector的Supplier会被多次调用),而toConcurrentMap会创建一个单个结果,每个线程都会向它抛出结果(这样一个收集器的供应商将只被调用一次)

为什么这很重要?这涉及广告订单(如果重要的话)。

toMap 将通过合并多个中间结果(该收集器的 Supplier 和 Combiner 多次调用)以遇到顺序在结果 Map 中插入值

toConcurrentMap 将通过将所有元素放入公共(public)结果容器(本例中为 ConcurrentHashMap)以任何顺序(未定义)收集元素。 Supplier 只被调用一次,Accumulator 被调用多次而 Combiner 永远不会被调用。

这里的小警告是,CONCURRENT 收集器不调用合并:流必须具有 UNORDERED 标志 - 通过 unordered () 显式调用或流源未排序时(例如 Set)。

关于java - Collectors.toConcurrentMap 和通过 Collectors.toMap 供应商选项将 Map 转换为 ConcurrentHashMap 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40888262/

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