【发布时间】:2021-07-01 17:36:42
【问题描述】:
我知道 Java 中的流中间操作是惰性的,并且在调用终端操作之前不会执行。但是,我不确定链接中间操作是否会增加所需的迭代次数。因为有时我们将操作分成多个中间操作,只是为了便于阅读。
所以例如下面的两个例子做同样的事情。但在第二个例子中,两个中间操作合二为一。
myStream
.map(s -> methodA(s))
.map(s -> methodB(s))
.collect(Collectors.joining());
myStream
.map(s -> methodB(methodA(s)))
.collect(Collectors.joining());
这两种情况所需的迭代次数不是相同吗?因为看起来,JVM 可以在单次迭代中执行它(类似于单次 for 循环),而不是为每个中间操作迭代元素。
【问题讨论】:
-
您的意思是时间复杂度...不是性能或执行时间?显然这里的时间复杂度是一样的。
-
时间 complexity 不会改变,可能一次你运行 N 次操作,另一次 N+N=2*N 次操作但它们仍然是 O(N)。如果您将其拆分为 100 个操作,您将运行 100*N 个操作,这仍然是 O(N)。
-
在谈到复杂性时,
O(2n)、O(3n)等无关紧要。他们都只是O(n)。它代表增长,而不是实际执行时间。 -
即使中间操作是否惰性,也不会改变时间复杂度。所以不要把时间复杂度和性能混为一谈。它们可能会相互作用,但仍然是完全不同的东西。
-
解决您更新的问题,两种变体都相当于一个循环。
标签: java java-stream