我有一个包含编码对象的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/