Java 流 reduce 教程展示了如何对 Java 8 流执行缩减操作。
Java 流
Java 流是来自源的支持聚合操作的一系列元素。 流不存储元素。 元素是按需计算的。 元素是从数据源(如集合,数组或 I / O 资源)中消耗的。
Java 流归约
归约是将流聚合为类型或基元的终端操作。 Java 8 Stream API 包含一组预定义的归约操作,例如average()
,sum()
,min()
,max()
和count()
,它们通过组合流的元素来返回一个值。
Java 流reduce
方法
Stream.reduce()
是用于生成自定义归约运算的通用方法。
此方法使用关联累加函数对该流的元素进行归约。 它返回一个Optional
描述归约的值(如果有)。
此方法采用两个参数:标识和累加器。 如果流中没有元素,则 identity 元素既是 reduce 的初始值,也是默认结果。 累加器函数具有两个参数:约简的部分结果和流的下一个元素。 它返回一个新的部分结果。 Stream.reduce()
方法返回归约的结果。
Java 流内置归约
以下示例使用了两个预定义的归约操作。
JavaReduceEx.java
我们有一个整数数组。 我们使用Arrays.stream()
从数组创建一个流,并执行两个归约:sum()
和count()
。
这是输出。
Java reduce
Optional
具有一个参数的reduce()
方法返回Optional
,这是用于 null 安全的 Java 类。
Car.java
这是Car
类。
JavaReduceEx2.java
该示例创建一个汽车对象列表。 我们计算出最昂贵的汽车。
从列表中,我们创建一个流; reduce()
方法的累加器会比较汽车的价格并返回价格较高的汽车。
如果返回的归约值不为 null,则将其打印到控制台。
This is the output.
下一个示例添加了其他用例。
MyUtil.java
这是MyUtil
类,具有一种将两个整数相加的方法。
JavaReduceEx3.java
我们创建三个不同的累加器函数来计算 1..10 值的总和。
在第一种情况下,我们使用 lambda 表达式进行加法。
第二种情况使用内置的Integer::sum
方法。
最后,我们有一个自定义的添加方法。
Java 归约标识
正如我们已经提到的,如果流中没有元素,则标识既是还原的初始值,又是默认结果。
User.java
这是User
类。 除了常用的属性,获取器和设置器之外,我们还有getAge()
方法,该方法使用 Java 8 日期 API 返回用户的年龄。
JavaReduceEx4.java
在示例中,我们创建了一个用户列表。 该示例计算最老用户的年龄。
从列表中,我们创建一个 Java 8 流。 使用mapToInt()
方法将流映射到IntStream
。 最后,reduce()
方法提供一个标识值(0)和一个累加器; 累加器将比较年龄值并返回较大的值。
在本教程中,我们已经使用 Java 流 简化操作。