概述
初识 Stream 中的 reduce() 方法,是在最近一次刷算法题的过程中(下面会讲到),简洁干练的写法,让我眼前一亮。
所以,我简单学习了,总结了一下写法:
正文
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
reduce()使用:
先看一下reduce() 方法内部,参数 BinaryOperator<T> 接口继承了 BiFunction 接口:
Optional<T> reduce(BinaryOperator<T> 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<User> 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接口
// 简单说 就是需要传入2个同类型参数,返回同类型的参数
// 预定义一下减法函数式
BinaryOperator<Integer> add = (n1, n2) -> n1+n2;
BinaryOperator<Integer> 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,8,9}
// 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 聚合函数写法是不是箱单简洁干练?用起来吧!
最后
以上就是开心荔枝为你收集整理的Java8 Stream 中的 reduce() 方法,执行聚合操作正文的全部内容,希望文章能够帮你解决Java8 Stream 中的 reduce() 方法,执行聚合操作正文所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复