java - Parallelstream().map().map() 是做什么的?

标签 java java-stream

我有一个包含编码对象的Collection(未编码时非常大),我想知道如果我执行以下操作,实际会发生什么:

codes.parallelStream().map(code -> decode(code)).map(obj -> do1(obj) * do2(obj));

由于我没有找到有关此类结构的更多信息,我想这首先会解码所有元素,然后才执行真正的任务,但另一方面,它会更符合逻辑(并且在情况下内存友好)大对象)在并行流的情况下,如果它会为每个元素同时执行两个映射,就像站立一样:

codes.parallelStream().map(code -> { obj = decode(code); return do1(obj) * do2(obj); });

有人可以帮我理解这是如何工作的吗?

最佳答案

map 操作是延迟计算的。因此,只有当流的终端操作评估编码对象时,才会执行第一个 map 调用中的 decode 操作。因此,您的 我认为这首先解码所有元素,然后才执行真正的任务 假设是错误的,因为终端操作可能只需要处理源 Collection 的少数元素,因此两者都不是在这种情况下,将对大多数编码元素执行 2 个 map 操作。

只有当中间 Stream 操作需要所有元素时(例如 sorted() 必须迭代所有元素),或者它先于一个 Stream 的所有元素,才可以处理它。需要所有元素的中间操作(例如在 ...map().sorted()... 中,执行 sorted() 需要首先执行 map () Stream 的所有元素)。

尽管第一个代码片段更具可读性,但两个代码片段的行为应该类似。

关于java - Parallelstream().map().map() 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32220197/

相关文章:

java - 如何在 GLCanvas 上绘图?

java - 修改部分列表,然后返回更新后的列表

java - 如何使用索引而不是前一个元素生成流?

Java 8 - 限制第一个对象的流并转换为特定对象?

java - 如何使用 Stream api 加入 MultiValueMap?

java - 使用递归对数字进行阶乘

java - JFrame 编号输入

java - 当我们有重复元素和自定义过滤条件时,在 Java 8 中将 List<MyObject> 转换为 Map<String, List<String>>

java - 子类的对象创建是否创建父类(super class)的对象,如果是,是否可以在子类中访问它?

java - 初始化实例变量的地方