基于list stream: reduce的使用实例
作者:有梦想的攻城狮 发布时间:2021-07-21 06:54:52
标签:list,stream,reduce
list stream: reduce的使用
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的基本用法
1、初识 reduce 的基本 api
@Test
public void testReduce() {
Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8});
//求集合元素只和
Integer result = stream.reduce(0, Integer::sum);
System.out.println(result);
stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
//求和
stream.reduce((i, j) -> i + j).ifPresent(System.out::println);
stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
//求最大值
stream.reduce(Integer::max).ifPresent(System.out::println);
stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
//求最小值
stream.reduce(Integer::min).ifPresent(System.out::println);
stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
//做逻辑
stream.reduce((i, j) -> i > j ? j : i).ifPresent(System.out::println);
stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
//求逻辑求乘机
int result2 = stream.filter(i -> i % 2 == 0).reduce(1, (i, j) -> i * j);
Optional.of(result2).ifPresent(System.out::println);
}
2、应用场景测试
求所有学生的成绩之和。
package com.jd;
import com.jd.bean.Score;
import com.jd.bean.Student;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
/**
* @author: wangyingjie1
* @version: 1.0
* @createdate: 2017-09-26 09:35
*/
public class ReduceTest {
@Test
public void reduceList() {
List<Student> list = getStudents();
//使用Reduce 将所有的所有的成绩进行加和
Optional<Score> totalScore = list.stream()
.map(Student::getScore)
.reduce((x, y) -> x.add(y));
System.out.println(totalScore.get().getPoint());
}
@Test
public void reduceList2() {
List<Student> list = getStudents();
Student student = getStudent();
//使用Reduce 求 list 、student 的总成绩之和
Score scoreSum = list.stream()
.map(Student::getScore)
//相当于加了一个初始值
.reduce(student.getScore(), (x, y) -> x.add(y));
System.out.println(scoreSum.getPoint());
}
private Student getStudent() {
Student student = new Student();
student.setId(4);
Score score = new Score();
score.setPoint(100);
student.setScore(score);
return student;
}
private List<Student> getStudents() {
List<Student> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
Student stu = new Student();
Score score = new Score();
score.setPoint(80);
score.setCourseName("English");
stu.setId(i);
stu.setScore(score);
list.add(stu);
}
return list;
}
}
package com.jd.bean;
//学生
public class Student {
private Integer id;
//课程分数
private Score score;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Score getScore() {
return score;
}
public void setScore(Score score) {
this.score = score;
}
}
package com.jd.bean;
//课程分数
public class Score {
//分数
private Integer point;
//课程名称
private String courseName;
public Integer getPoint() {
return point;
}
public Score add(Score other) {
this.point += other.getPoint();
return this;
}
public void setPoint(Integer point) {
this.point = point;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
}
来源:https://zhangzehai.blog.csdn.net/article/details/106369542


猜你喜欢
- Q1: Object类型包含哪些方法?A1: Object类型共包含6个方法,Equals, GetHashCode, ToString,
- 一、创建线程启动线程—start 方法通过覆写 run 方法创建⼀个线程对象,但线程对象被创建出来并不意味着线程就开始运
- 如图,刚开始报错获取不到bean因为配置文件1、原因一: *.properties等没有值,还是用${变量的}。获取不到,于是把所有值复制到
- 1.注解方式,yml文件配置上以下就可以直接使用mybatis-plus: mapper-locations: classpath:mapp
- 近日在研究重构代码的时候有用到idea的不少插件,比如CheckStyle,同时下载了阿里的开发规约,受到不少启发。规约中会要求所有的方法都
- 1、try with catch还记得这样的代码吗?我们需要手动的关闭资源的流,不然会造成资源泄漏,因为虚拟机无法管理系统资源的关闭,必须手
- 准备过程:在电脑桌面 右键点击 “此电脑”的“属性”选项选择“高级系统设置”选项点击下面的“环境变量”选项配置过程:点击“系统变量”下面的”
- mybatis update并非所有字段需要更新mybatis update需求:更新字段作为参数,未更新字段不传入解决办法<upda
- ComparableComparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Compa
- 今天在编译Java程序时遇到如下问题:No enclosing instance of type PrintListFromTailToHe
- 结构化查询语言(SQL)是一种标准化的语言,它允许你在数据库上执行操作,如创建项目,读取内容,内容更新和删除条目。SQL是所有可能会使用几乎
- 1、找奇数:public static boolean isOdd(int i){ return i % 2 == 1; }上面的方法真
- 这次记录的是实现Android图片两手触控缩放的功能。编译环境:eclipseAndroid版本4.0创建工程过程略实现图片在页面两手触控缩
- C#编写一个简易计算器,供大家参考,具体内容如下界面代码using System;using System.Collections.Gene
- 一、前言做新应用就是这样,会遇到各种问题,昨天刚解决了加载某一个类时候抛出了 class is not visible from class
- 实现Android 滑动退出Activity的功能android向右滑动,退出activity//右滑删除 compile &
- 在研究性能的时候,完全可以使用Stopwatch计时器计算一项技术的效率。但是有时想知道某想技术的性能的时候,又常常想不起可以运用Stopw
- 首先需要明白一点,只有scop为(singleton)单例类型的Bean,spring才支持循环依赖。scope为(prototype)原型
- 一、Servlet概述1.sun公司提供的动态web资源开发技术。本质是上一段java小程序,要求这个小程序必须实现Servlet接口,以便
- 主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中。主Activitypackage