基于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
投稿

猜你喜欢

  • Java C++实现相同MD5加密算法的方式

    2023-10-12 12:26:02
  • 详解Java 集合系列(三)—— LinkedList

    2022-01-30 16:49:10
  • java中switch选择语句代码详解

    2023-09-28 19:34:29
  • Java这个名字的来历与优势

    2023-03-27 18:28:40
  • 基于selenium-java封装chrome、firefox、phantomjs实现爬虫

    2022-04-07 19:04:28
  • SpringBoot之Helloword 快速搭建一个web项目(图文)

    2023-08-23 17:36:21
  • 详解SpringBoot中Session超时原理说明

    2022-01-24 06:40:49
  • springboot结合vue实现增删改查及分页查询

    2023-11-24 15:53:44
  • Spring使用AOP完成统一结果封装实例demo

    2021-12-16 18:49:06
  • spring boot整合log4j2及MQ消费处理系统日志示例

    2023-06-17 17:47:54
  • 一文带你了解C#中抽象方法与虚方法的区别

    2023-07-23 00:14:32
  • 入门JDK集合之HashMap解析

    2023-11-24 02:45:03
  • Android 中ScrollView嵌套GridView,ListView的实例

    2023-06-15 15:49:56
  • 实例解析Java中的构造器初始化

    2022-11-22 07:42:27
  • java中的String定义的字面量最大长度是多少

    2023-09-01 08:35:31
  • fastjson生成json时Null属性不显示的解决方法

    2022-08-17 15:56:59
  • java开发分布式服务框架Dubbo暴露服务过程详解

    2021-07-19 17:59:50
  • 总结一次C++ 程序优化历程

    2023-11-02 22:38:30
  • java8使用filter()取出自己所需数据

    2023-04-07 02:30:37
  • 如何将IDEA打成jar包并在windows后台运行

    2022-02-27 01:36:57
  • asp之家 软件编程 m.aspxhome.com