Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8中的顺序流在调用collect时是否使用combiner参数?_Java_Java 8_Java Stream - Fatal编程技术网

Java8中的顺序流在调用collect时是否使用combiner参数?

Java8中的顺序流在调用collect时是否使用combiner参数?,java,java-8,java-stream,Java,Java 8,Java Stream,如果我在顺序流上调用collect(例如从调用Collection.stream()),那么它会使用我传递给collect的combiner参数吗?我想没有,但我在文件中什么也没看到。如果我是正确的,那么很遗憾必须提供一些我知道不会使用的东西(如果我知道它是一个顺序流)。请记住,要根据接口规范而不是实现进行开发。实现可能会随着下一个Java版本而改变,而规范应该保持稳定 该规范没有区分顺序流和并行流。因此,您应该假设可能会使用组合器。实际上,有一些很好的例子表明,用于顺序流的组合器可以提高性能。

如果我在顺序流上调用collect(例如从调用Collection.stream()),那么它会使用我传递给collect的combiner参数吗?我想没有,但我在文件中什么也没看到。如果我是正确的,那么很遗憾必须提供一些我知道不会使用的东西(如果我知道它是一个顺序流)。

请记住,要根据接口规范而不是实现进行开发。实现可能会随着下一个Java版本而改变,而规范应该保持稳定

该规范没有区分顺序流和并行流。因此,您应该假设可能会使用组合器。实际上,有一些很好的例子表明,用于顺序流的组合器可以提高性能。例如,下面的reduce操作连接字符串列表。在没有组合器的情况下执行代码具有二次复杂性。使用组合器的智能执行可以在很大程度上减少运行时间

List<String> tokens = ...;
String result = tokens.stream().reduce("", String::concat, String::concat);
列出令牌=。。。;
String result=tokens.stream().reduce(“,String::concat,String::concat);

为组合器传递null时会发生什么情况?你从这个实验中推断出什么?@JBNizet它将抛出NullPointerException。如果
实现认识到使用组合器是否可以提高性能,那将是非常明智的。然而,更大的风险是,开发人员自己在忘记省略的合并器时将流更改为并行…@Holger Right,或者其他开发人员将流传递给您的代码,并且该流将来可能会更改为并行。谢谢您的回答。我也遇到了同样的问题,尽管我一直坚持针对接口进行开发,但我发现很遗憾,没有一个没有组合器的收集器的“简单”版本。这将使事情变得容易得多。他们可以制作一个
收集器。特征
来表明这一点,或者制作一个更简单版本的
收集器
接口……还有一个问题:我发现一句话
使用收集器的顺序还原实现将使用供应商函数创建一个结果容器,并为每个输入元素调用一次累加器函数。
这是否已经表明在这种情况下没有使用合并器?@GeekFactory您忽略了“仅合并它们”的成本。字符串连接意味着创建一个新字符串,该字符串是两个参数字符串的副本。绳子越长,开销越大。多个字符串连接的中间结果是字符串越来越长。你可以搜索“画家的算法”来获得直观的图片。另请参阅以明确说明,
collect(joining())
仍然更好,但我希望您看到,在本例中,使用组合器可以减少开销。