Java8 Stream 中的 reduce() 方法,执行聚合操作
时间:2022-09-24 21:30:00
初识 Stream 中的 reduce() 方法是在最后一次刷算法题的过程中,简洁干练的写法让我眼前一亮。
因此,我简单地学习并总结了写作方法:
正文
Java 8 API新的抽象被称为流动Stream,您可以通过声明处理数据。
Stream API可大大提高Java程序员的生产力使程序员能够写出高效、干净、简洁的代码。
这种风格将要处理的元素集合视为流动, 流在管道中传输, 管道节点可处理, 比如筛选, 排序、聚合等。
reduce()使用:
先看一下reduce() 方法内部,参数 BinaryOperator
Optional reduce(BinaryOperator accumulator);
简单来说,BinaryOperator 函数接口类似 Lambda 表达式(->),接收两个参数并产生一个结果,但其三个参数是相同的数据类型。
@Data public class User { private String username; private String gender; private Integer age; public User(){} public User(String username, String gender, Integer age) { this.username = username; this.gender= gender; this.age = age; } public static void main(final String... args) { ArrayList list = new ArrayList<>(); list.add(new User("jimmy", "1", 30)); list.add(new User("amy", "2", 20)); list.add(new User("simmy", "1", 10)); // reduce 需要输入一个BinaryOperator接口,继承了BiFunction接口 // 简单说 需要输入两个相同类型的参数并返回相同类型的参数 // 预定义减法函数式 BinaryOperator add = (n1, n2) -> n1 n2; BinaryOperator minus = (n1, n2) -> n1-n2; list.stream().map(n->n.getAge()).reduce(add).ifPresent(n-> System.out.println(n)); // 加法 list.stream().map(n->n.getAge()).reduce(minus).ifPresent(n-> System.out.println(n)); // 减法 // 未预定义,直接写函数式 list.stream().map(n->n.getAge()).reduce((a,b)->a*b).ifPresent(n-> System.out.println(n)); // 乘法 } } // 输出结果: 60 0 6000
算法题
下面是我用的reduce参考聚合函数的场景:
题目:剑指offer》- 找出只出一次的数字 题目描述:给定一个非空整数组,除了一个一个元素只出现一次,每个元素都出现两次,找出只出现一次的元素。 思路:两个相同的数异或后来 0,一个数和 0 或者它本身,将所有的数异或后来得到 A、B 不同或不同的结果,然后得到 1 出现在这个数字的最右边 index,然后判断每个数右移 index 后是不是 1。
int[] nums = {1,2,3,4,5,6,7,89} // 1.for循环写法 public int singleNumber_1(int[] nums) { int num = nums[0]; for (int i = 1; i < nums.length; i ) { num ^= nums[i]; } return num; } // 2.stream 写法 public int singleNumber_2(int[] nums) { return Arrays.stream(nums).reduce((a, b) -> a^b).getAsInt(); }
看看,stream 的 reduce 聚合函数写法简单干练吗?