Java8流的时间和原因

Java8流的时间和原因,java,java-stream,scalability,Java,Java Stream,Scalability,我最近开始从事一个项目,他们鼓励使用streams lambdas等编写代码。基本上,函数式编程方法。虽然我觉得溪流很吸引人,但我对它们有一些怀疑。具体如下 性能-串行流真的比相应的集合更快、更具可扩展性吗?或者,流只是因为有一天我们可能会使用stream().parallel()版本而更可取吗 内存使用-如果collect(toList())等终端操作通常会创建一个新对象,那么流是否会对堆内存造成负担 垃圾收集(GC)-流是否比垃圾收集更友好 编程范式-我个人认为,将函数式编程风格与面向

我最近开始从事一个项目,他们鼓励使用streams lambdas等编写代码。基本上,函数式编程方法。虽然我觉得溪流很吸引人,但我对它们有一些怀疑。具体如下

  • 性能-串行流真的比相应的集合更快、更具可扩展性吗?或者,流只是因为有一天我们可能会使用stream().parallel()版本而更可取吗

  • 内存使用-如果collect(toList())等终端操作通常会创建一个新对象,那么流是否会对堆内存造成负担

  • 垃圾收集(GC)-流是否比垃圾收集更友好

  • 编程范式-我个人认为,将函数式编程风格与面向对象编程相结合会导致一些问题

  • 调试-我个人用笔和纸调试代码,而不是使用调试器(有些人可能更喜欢使用调试器)。当涉及到调试时,流有多好

  • 操作复杂性-当涉及到编写日常代码(过滤分组-收集映射)时,流是一个很难解决的问题,但我发现当我必须编写复杂的逻辑时,我最终求助于旧的基于收集的方法,因为它更容易调整。我是唯一一个这样做的人吗

  • 我知道我在这里问了很多问题,但实际上它们是标题中提到的同一个问题的6个部分。希望这些子问题至少能有一个类似摘要的答案。如果有人也能添加一个链接来深入了解所有这些内容,那将是非常有帮助的

    干杯

    性能-串行流真的比相应的集合更快、更具可扩展性吗

    不,至少,不是一般的。。。使用当前的流实现

    或者,流只是因为有一天我们可能会使用
    stream().parallel()
    版本而更可取吗

    可能是的。然而,对于许多用例,使用
    parallel()
    的开销超过了可能的加速

    内存使用-如果collect(toList())等终端操作通常会创建一个新对象,那么流是否会对堆内存造成负担

    好的,不。通常不会减少内存使用

    垃圾收集(GC)-流是否比收集更友好

    阿福,不

    编程范式——我个人认为,将函数式编程风格与面向对象编程相结合会导致一些问题

    那是你的意见

    如果您坚持让您的流操作没有副作用,那么就不会有任何问题

    • 文档建议避免流操作中的副作用
    • 如果你依赖副作用,那是不起作用的
    调试-我个人用笔和纸调试代码,而不是使用调试器(有些人可能更喜欢使用调试器)。当涉及到调试时,流有多好

    那是意见的问题。我个人认为这对调试没有影响

    操作复杂性——当编写日常代码(过滤、分组、收集映射)流时,这是一个棘手的问题,但我发现当我必须编写复杂的逻辑时,我最终求助于旧的基于集合的方法,因为它更容易调整。我是唯一一个这样做的人吗

    你不是唯一一个。另一方面,许多人使用比简单的过滤、分组、收集和映射要复杂得多的东西。使用流越多,发现其他用例的能力就越好。但另一方面,有些人似乎想用流做一些他们可能不应该做的事情


    我最近开始从事一个项目,他们鼓励使用streams lambdas等编写代码


    这是你和其他队员之间的事。我认为我/我们不应该介入您的项目团队在这个问题上的争论。

    Java streams的主要好处之一是它们可以实时处理数据。例如,假设您有一个1000个数据点的数组。如果要用传统方法处理,则需要批处理。这意味着在处理完所有项目之前,您不会得到第一个已处理项目的结果。正如您可以想象的那样,这会大大降低速度,尤其是当您的方法是管道的一部分时。假设此方法需要10分钟(证明一点的极端示例)才能完成。另外,假设这是20个不同过程中的第一个,每个过程花费的时间大致相同。处理一个数组需要200分钟

    现在想象一下,同样的管道,所有的过程都花费了同样的时间,但不是批量处理,而是流式处理数据。这涉及通过函数逐个处理数组项。结果是,一旦你的第一项工作完成,它就可以继续进行到流程中的下一个点。在我们的示例中,第一项可能在几秒钟内完成。它可以立即移动到链中的下一个链接,而不必等待其他999条数据进行处理。这确保了链后端的进程被阻塞的时间要短得多

    显然,这是一个理论例子。因此,它不考虑线程阻塞等问题。但是,能够在一个集合上同时运行多个进程的优势仍然巨大


    这也是大多数Java流函数返回流的原因。它们被设计成在一种管道中运行

    几乎所有问题的答案都是“视情况而定”。流通常不是神奇的,它们应该只在生成的代码简单明了的地方使用,没有任何意义