gpt4 book ai didi

lambda - 使用 collect 时的并发数据结构和并行流

转载 作者:行者123 更新时间:2023-12-04 16:37:21 36 4
gpt4 key购买 nike

在完成以下讨论 using concurrent data structures in streamsdifferent between using concurrent map and converting to a map 的答案后,有人可以解释如果我使用 collect 的其他语法会发生什么,即

    Stream<Integer> integers = Stream.iterate(1, n -> n + 1).parallel(); 
Map<Integer, Boolean> resultMap = integers
.limit(1000)
.collect(HashMap::new,
(map, value) -> map.put(value, false),
HashMap::putAll);

根据文档,将根据产生的线程数调用供应商。如果我使用 ConcurrentHashMap 而不是 HashMap 怎么办?

When executed in parallel, multiple intermediate results may be instantiated, populated, and merged so as to maintain isolation of mutable data structures. Therefore, even when executed in parallel with non-thread-safe data structures (such as ArrayList), no additional synchronization is needed for a parallel reduction.

最佳答案

当您使用 ConcurrentHashMap 时,行为不会发生变化而不是 HashMap与三个参数 collect方法。要更改行为,您需要 Collector报告 CONCURRENT 特性,并且无法使用临时收集器指定特性。

此外,该操作必须是无序的以启用并行收集操作,其中所有线程累积到单个容器中。由于流属性,操作可能是无序的,或者本质上,例如在像 HashSet 这样的无序源上流式传输时, 或通过 unordered() 明确,例如

Map<Integer, Boolean> resultMap = integers.limit(1000)
.unordered()
.collect(Collector.of(
() -> new ConcurrentHashMap<>(),
(map, value) -> map.put(value, false),
(m1,m2) -> { m1.putAll(m2); return m1; },
Collector.Characteristics.CONCURRENT));

或由于 UNORDERED收藏家的特点:
Map<Integer, Boolean> resultMap = integers.limit(1000)
.collect(Collector.of(
() -> new ConcurrentHashMap<>(),
(map, value) -> map.put(value, false),
(m1,m2) -> { m1.putAll(m2); return m1; },
Collector.Characteristics.CONCURRENT, Collector.Characteristics.UNORDERED));

后者是您在使用内置收集器时得到的:
Map<Integer, Boolean> resultMap = integers.limit(1000)
.collect(Collectors.toConcurrentMap(Function.identity(), i -> Boolean.FALSE));
toConcurrentMap将永远是 CONCURRENTUNORDERED并且需要 ConcurrentMap当您使用 map 供应商时,而 toMap绝不是 CONCURRENT ,即使您提供创建 ConcurrentMap 实例的供应商执行。

关于lambda - 使用 collect 时的并发数据结构和并行流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49899266/

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