当前位置: 首页 > 面试题库 >

从Java 8中的并行流收集

都才俊
2023-03-14
问题内容

我想接受输入并对其应用并行流,然后我希望将输出作为列表。输入可以是任何列表或可以对其应用流的任何集合。

我在这里担心的是,如果我们要输出为map,我们可以从java中选择一个选项,例如

list.parallelStream().collect(Collectors.toConcurrentMap(args))

但是我看不到以线程安全的方式从并行流收集以提供列表作为输出的选项。我看到那里还有一个选择

list.parallelStream().collect(Collectors.toCollection(<Concurrent Implementation>))

通过这种方式,我们可以在collect方法中提供各种并发实现。但是我认为java.util.concurrent中仅存在CopyOnWriteArrayList
List实现。我们可以在这里使用各种队列实现,但是这些将与列表不同。我的意思是,我们可以通过变通方法来获取列表。

如果我想将输出作为列表,请您指导我什么是最好的方法?

注意:我找不到与此相关的任何其他帖子,任何参考资料将对您有所帮助。


问题答案:

Collection用于接收要收集的数据的对象不需要并发。您可以给它一个简单的方法ArrayList

这是因为来自并行流的值的收集实际上并未收集到单个Collection对象中。每个线程将收集自己的数据,然后所有子结果将 合并
到单个最终Collection对象中。

所有这些都在Collectorjavadoc中有充分的文档证明,并且Collector您为该collect()方法提供的参数是:

<R,A> R collect(Collector<? super T,A,R> collector)


 类似资料:
  • 它们之间有什么相同和不同之处,看起来Java并行流中有RXJava中可用的一些元素,是吗?

  • 我有以下代码: 此代码不工作,编译错误是: 方法无法应用于给定类型 必选:

  • 考虑到我有2个CPU核心的事实,并行版本不是应该更快吗?有人能给我一个提示为什么并行版本比较慢吗?

  • 是否可以为Java8并行流指定自定义线程池?我到处都找不到它。 如果我不能为不同的模块使用不同的线程池,这就意味着我不能在大多数真实世界的情况下安全地使用并行流。 请尝试以下示例。有些CPU密集型任务在单独的线程中执行。这些任务利用并行流。第一个任务被打破,因此每一步需要1秒(通过线程Hibernate模拟)。问题是其他线程会被卡住,等待中断的任务完成。这是一个虚构的示例,但假设一个servlet

  • 问题内容: 它是纠正与Java 8,你需要执行下面的代码确实获得从平行流Collection? 从CollectionAPI: 默认Stream parallelStream() 返回一个可能与此流作为其源的并行Stream。此方法允许返回顺序流。 从BaseStreamAPI: S parallel() 返回并行的等效流。可能由于流已经是并行的,或者因为基础流的状态被修改为并行而返回自身。 我需