Java流-我应该使用reduce还是collect?

Java流-我应该使用reduce还是collect?,java,lambda,java-stream,Java,Lambda,Java Stream,我使用Java9。我正在学习Baeldung(即EUGEN PARASCHIV)的collect()和reduce()等流操作 我必须列出所有以逗号分隔的员工姓名。本教程使用collect()完成此操作。但是,我可以使用reduce()和collect()来完成。我见过一些使用collect only将元素放入集合(如List)的示例。那么,我如何知道何时使用reduce()或collect() 输出: reduce : Jeff Bezos, Bill Gates, Mark Zuckerbe

我使用Java9。我正在学习Baeldung(即EUGEN PARASCHIV)的collect()和reduce()等流操作

我必须列出所有以逗号分隔的员工姓名。本教程使用collect()完成此操作。但是,我可以使用reduce()和collect()来完成。我见过一些使用collect only将元素放入集合(如List)的示例。那么,我如何知道何时使用reduce()或collect()

输出:

reduce : Jeff Bezos, Bill Gates, Mark Zuckerberg
collect : Jeff Bezos, Bill Gates, Mark Zuckerberg

如果可以选择其中一种,请使用
collect()
。您的示例是一个很好的示例,典型的是经过仔细开发和测试的
收集器
为常见用例带来的简单、清晰和正确性。

收集器。加入(“,”)
基本上是一种缩减-所有元素融合在一起形成一个值-但它遵守收集器的契约,因为它保持自己的状态


虽然将其作为一种归约实现对您很有指导意义,但我会使用collector.joining(),因为99%的代码是为您编写的。

如果您想要不可变的归约,那么您应该使用
reduce()
或使用
collect()
进行可变的归约

有关更多详细信息,请观看视频


java.util.stream
的功能似乎将
reduce
collect
区分开来,后者是前者的特化。无论您在哪里找到经过良好测试的
collect
替代
reduce
,请使用它。这只是一种特殊化。您的
reduce(“,(a,b)->a+”,“+b)
变体将产生一个前导逗号,您肯定不希望这样。您必须使用
reduce((a,b)->a+“,“+b).orElse(”)
。当您有两个或更少的流元素时,reduce变量将更有效。也许,它甚至赢得了三个要素。但是,元素越多,
收集的效率越高。大数字的区别是重要的……您说过99%的代码是为您编写的。你能详细说明一下吗?谢谢
reduce : Jeff Bezos, Bill Gates, Mark Zuckerberg
collect : Jeff Bezos, Bill Gates, Mark Zuckerberg