当前位置:嗨网首页>书籍在线阅读

09-结果分析

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

结果分析

从以上的例子可以学习如何使用Java流提供的不同归约操作。首先,我们使用了 DoubleStreamIntStreamLongStream 提供的一些特殊的归约操作。这些操作计算流中元素的数量、平均值、总和、最大值和最小值。如果使用普通流,则只有计算元素总数的 count() 方法。

然后使用 Stream 类提供的3个版本的 reduce() 方法。第一个版本只接收一个 BinaryOperator 参数。我们用lambda表达式指定了 BinaryOperator ,而且通常都是这么做的,不过也可以使用一个实现 BinaryOperator 接口的实例对象。该运算对象接收流中的两个元素,然后生成一个相同类型的新元素,比如接收两个 Point 对象并生成一个新的 Point 对象。 BinaryOperator 所实现的操作必须符合结合律,也就是说,如下表达式必须为真:

(a op b) op c = a op (b op c)

这里的 op 就是 BinaryOperator

该版本的 reduce() 方法返回了一个 Optional 对象。 Optional 存在的原因是,如果流是空的,则它不会返回一个结果值,也就是说, Optional 对象会是空的。

第二个版本的 reduce() 方法接收了一个满足同一律的值和一个 BinaryOperator 。这个 BinaryOperator 也必须满足结合律,这点和其他版本的 reduce() 方法一样。而对于一个满足同一律的值,必须使如下表达式为真:

identity op a = a op identity = a

该版本的 reduce() 方法返回了一个和流中元素相同类型的结果。如果流里没有元素,则返回同一律值。

最后一个版本的 reduce() 方法用在返回值和元素类型不同时。在这种情况下,该方法有3个参数: identity 值、 accumulator 运算函数和 combiner 运算函数。 accumulator 运算函数接收与该方法返回值相同类型的值和流的元素,并生成和返回值相同类型的新对象。

combiner 函数接收两个和返回值相同类型的对象,并计算出一个同类型的新对象。 identity 值是返回类型的 identity 值,它必须验证如下表达式:

combiner(u, accumulator(identity, t))==accumulator(u, t)

这里的 u 是一个和返回值类型相同的对象, t 是流中的元素。

该案例的输出结果如下图所示。

46.png