基于list stream: reduce的使用实例

作者:有梦想的攻城狮 时间:2021-07-21 06:54:52 

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

标签:list,stream,reduce
0
投稿

猜你喜欢

  • Android ViewPager2 使用及自定义指示器视图实现

    2022-06-16 09:35:26
  • SpringMVC上传图片与访问

    2023-12-06 17:54:31
  • Android开发之针对联系人的封装

    2023-12-24 05:56:25
  • Android列表选择框Spinner使用方法详解

    2023-10-04 13:18:02
  • Android实现网络多线程断点续传下载功能

    2021-05-29 18:22:24
  • 配合Swagger使用绝佳的两款直观易用JSON可视化工具

    2021-10-14 23:50:23
  • 详解如何让Spring MVC显示自定义的404 Not Found页面

    2023-12-12 15:48:47
  • MyBatis使用动态表或列代码解析

    2023-06-13 07:57:40
  • 微信小程序 跳转页面的两种方法详解

    2023-11-03 13:04:21
  • 基于Java SWFTools实现把pdf转成swf

    2023-09-01 20:19:02
  • Go Java算法最大单词长度乘积示例详解

    2022-09-27 18:16:19
  • JAVA版排序算法之快速排序示例

    2023-04-20 04:37:53
  • Android实现悬浮窗的简单方法实例

    2023-06-17 18:11:02
  • 在springboot中如何使用filter设置要排除的URL

    2022-11-06 00:06:01
  • java多线程中的异常处理机制简析

    2021-11-18 01:54:39
  • Springboot 整合 RabbitMQ 消息队列 详情

    2021-07-17 18:49:42
  • C# 位图BitArray的使用

    2022-09-13 23:54:46
  • HTTP基本认证(Basic Authentication)的JAVA实例代码

    2022-06-08 13:03:32
  • 详解Mybatis注解写法(附10余个常用例子)

    2023-01-19 03:39:53
  • 一篇文章彻底搞清楚c#中的委托与事件

    2021-09-07 02:24:03
  • asp之家 软件编程 m.aspxhome.com