Java8流的时间和原因
我最近开始从事一个项目,他们鼓励使用streams lambdas等编写代码。基本上,函数式编程方法。虽然我觉得溪流很吸引人,但我对它们有一些怀疑。具体如下Java8流的时间和原因,java,java-stream,scalability,Java,Java Stream,Scalability,我最近开始从事一个项目,他们鼓励使用streams lambdas等编写代码。基本上,函数式编程方法。虽然我觉得溪流很吸引人,但我对它们有一些怀疑。具体如下 性能-串行流真的比相应的集合更快、更具可扩展性吗?或者,流只是因为有一天我们可能会使用stream().parallel()版本而更可取吗 内存使用-如果collect(toList())等终端操作通常会创建一个新对象,那么流是否会对堆内存造成负担 垃圾收集(GC)-流是否比垃圾收集更友好 编程范式-我个人认为,将函数式编程风格与面向
stream().parallel()
版本而更可取吗
可能是的。然而,对于许多用例,使用parallel()
的开销超过了可能的加速
内存使用-如果collect(toList())等终端操作通常会创建一个新对象,那么流是否会对堆内存造成负担
好的,不。通常不会减少内存使用
垃圾收集(GC)-流是否比收集更友好
阿福,不
编程范式——我个人认为,将函数式编程风格与面向对象编程相结合会导致一些问题
那是你的意见
如果您坚持让您的流操作没有副作用,那么就不会有任何问题
- 文档建议避免流操作中的副作用
- 如果你依赖副作用,那是不起作用的
我最近开始从事一个项目,他们鼓励使用streams lambdas等编写代码
这是你和其他队员之间的事。我认为我/我们不应该介入您的项目团队在这个问题上的争论。Java streams的主要好处之一是它们可以实时处理数据。例如,假设您有一个1000个数据点的数组。如果要用传统方法处理,则需要批处理。这意味着在处理完所有项目之前,您不会得到第一个已处理项目的结果。正如您可以想象的那样,这会大大降低速度,尤其是当您的方法是管道的一部分时。假设此方法需要10分钟(证明一点的极端示例)才能完成。另外,假设这是20个不同过程中的第一个,每个过程花费的时间大致相同。处理一个数组需要200分钟 现在想象一下,同样的管道,所有的过程都花费了同样的时间,但不是批量处理,而是流式处理数据。这涉及通过函数逐个处理数组项。结果是,一旦你的第一项工作完成,它就可以继续进行到流程中的下一个点。在我们的示例中,第一项可能在几秒钟内完成。它可以立即移动到链中的下一个链接,而不必等待其他999条数据进行处理。这确保了链后端的进程被阻塞的时间要短得多 显然,这是一个理论例子。因此,它不考虑线程阻塞等问题。但是,能够在一个集合上同时运行多个进程的优势仍然巨大
这也是大多数Java流函数返回流的原因。它们被设计成在一种管道中运行几乎所有问题的答案都是“视情况而定”。流通常不是神奇的,它们应该只在生成的代码简单明了的地方使用,没有任何意义