stream 中的 reduce 的主要作用就是stream中元素进行组合,组合的方式可以是加减乘除,也可以是拼接等,接下来我们就通过实例来看一下reduce的用法:
reduce 一共有三种实现:
1、T reduce(T identity, BinaryOperator accumulator);
该实现有起始值 identity, 起始值的类型决定了返回结果的类型,通过 accumulator 操作最终得到 identity 类型的返回结果
2、Optional<T> reduce(BinaryOperator accumulator);
该实现只有一个参数 accumulator , 由于没有办法确定具体的返回结果,所以该方法返回的是 Optional
3、<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
该方法有三个参数 identity 、 accumulator 、combiner ,该方法通过 identity 和 accumulator的处理得出最终结果,结果和第一个参数的类型相同
首先把我们下面操作的这个实体对象先放在这里:
pulbic class User {
//ID
private Long id;
//年龄
private int age;
//班级
private String classes;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getClasses() {
return classes;
}
public void setClasses(String classes) {
this.classes = classes;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", age=" + age +
", classes='" + classes + '\'' +
'}';
}
- 用来求和,如下所示是四种不同的方式来获取User对象中的age只和,其中两种是通过reduce来进行求和
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(10);
userList.add(user1);
User user2 = new User();
user2.setAge(20);
userList.add(user2);
User user3 = new User();
user3.setAge(25);
userList.add(user3);
int ageSumThree = userList.stream().map(User::getAge).reduce(0, Integer::sum);
System.out.println("ageSumThree: " + ageSumThree);
int ageSumFive = userList.stream().map(User::getAge).reduce(Integer::sum).orElse(0);
System.out.println("ageSumFive: " + ageSumFive);
int ageSumOne = userList.stream().collect(Collectors.summingInt(User::getAge));
System.out.println("ageSumOne" + ageSumOne);
int ageSumFour = userList.stream().mapToInt(User::getAge).sum();
System.out.println("ageSumFour: " + ageSumFour);
- 用来求最大最小值,如下所示是求User中age的最大最小值
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(10);
userList.add(user1);
User user2 = new User();
user2.setAge(20);
userList.add(user2);
User user3 = new User();
user3.setAge(25);
userList.add(user3);
User user4 = new User();
user4.setAge(25);
userList.add(user4);
int min = userList.stream().map(User::getAge).reduce(Integer::min).orElse(0);
System.out.println("min : " + min);
int max = userList.stream().map(User::getAge).reduce(Integer::max).orElse(0);
System.out.println("max : " + max);
}
- 用来拼接字符串,如下所示:
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(10);
userList.add(user1);
User user2 = new User();
user2.setAge(20);
userList.add(user2);
User user3 = new User();
user3.setAge(25);
userList.add(user3);
User user4 = new User();
user4.setAge(25);
userList.add(user4);
String append = userList.stream().map(User::toString).reduce("拼接字符串:", String::concat);
System.out.println("append : " + append);
}
- 计算平均值:计算User对象中age字段的平均值
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(10);
userList.add(user1);
User user2 = new User();
user2.setAge(20);
userList.add(user2);
User user3 = new User();
user3.setAge(25);
userList.add(user3);
User user4 = new User();
user4.setAge(25);
userList.add(user4);
double average = userList.stream().mapToInt(User::getAge).average().orElse(0.0);
System.out.println("average : " + average);
}
关于reduce处理的中间过程,可以下查看下面的这篇博文,写的非常不错: https://blog.csdn.net/weixin_43860260/article/details/94875064