首页 > 其他分享 >基于list stream: reduce的使用实例

基于list stream: reduce的使用实例

时间:2022-08-25 09:37:38浏览次数:142  
标签:stream list reduce userList User new public

目录
  • list stream: reduce的使用
    • reduce 一共有三种实现
      • 1、第一种
      • 2、第二种
      • 3、第三种
  • reduce的基本用法
    • 1、初识 reduce 的基本 api
    • 2、应用场景测试

 

list stream: reduce的使用

stream 中的 reduce 的主要作用就是stream中元素进行组合,组合的方式可以是加减乘除,也可以是拼接等,接下来我们就通过实例来看一下reduce的用法:

 

reduce 一共有三种实现

 

1、第一种

?
1 T reduce(T identity, BinaryOperator accumulator);
 

该实现有起始值 identity, 起始值的类型决定了返回结果的类型,通过 accumulator 操作最终得到 identity 类型的返回结果

 

2、第二种

?
1 Optional<T> reduce(BinaryOperator accumulator);
 

该实现只有一个参数 accumulator , 由于没有办法确定具体的返回结果,所以该方法返回的是 Optional

 

3、第三种

?
1 <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
 

该方法有三个参数 identity 、 accumulator 、combiner ,该方法通过 identity 和 accumulator的处理得出最终结果,结果和第一个参数的类型相同

首先把我们下面操作的这个实体对象先放在这里

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 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来进行求和

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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的最大最小值

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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); }
 

用来拼接字符串,如下所示:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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字段的平均值

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 @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、应用场景测试

求所有学生的成绩之和。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 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;     } }
  ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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;     } }
  ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 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

标签:stream,list,reduce,userList,User,new,public
From: https://www.cnblogs.com/tiancai/p/16623124.html

相关文章

  • Java8 对list集合中的bigdecimal进行分组求和,均值,最大值,最小值
     文章目录需求中对数值进行求和的非常多,但java8对bigdecimal求和没有封装新建接口ToBigDecimalFunction新建工具类CollectorsUtil实体类Person 需求中对......
  • List连环问
    List连环问List?List是一个接口,常见的实现类有ArrayList和LinkedListArrayList和LinkedList的区别?ArrayList的底层数据结构是数组,支持下标访问,查询数据快。默认初始......
  • Stream
    /**使用普通集合操作数据的弊端:*每个需求都需要循环,这样需要一个新的集合来存储最终的数据,操作麻烦*//**操作Stream注意的3点:*1.Stream流只能操作一次*2.St......
  • 双流网络two stream network学习笔记草稿(待整理)
    卷积神经网络比较擅长学习局部的特征,而非物体移动的规律先将运动信息抽取好(光流),再让CNN去学习这种(运动信息到动作分类间的)映射空间流的输入是单帧图片,而时间流的输入是一系......
  • MapReduce-day1
    MapReducehadoop-ha问题dfs.ha.fencing.methods表示:alistofscriptsorJavaclasseswhichwillbeusedtofencetheActiveNameNodeduringafailover而配置......
  • ArrayList学习
    核心源码packagejava.util;importjava.util.function.Consumer;importjava.util.function.Predicate;importjava.util.function.UnaryOperator;publiccla......
  • Reid操作list、 Jedis操作set&sorted
    Reid操作list 3)列表类型list:linkedlist格式。支持重复元秦lpush/rpushlpop/rpop案例:@Testpublicvoidtest4(){Jedis......
  • pagehelper list数据处理后进行分页
    问题背景:PageHelper的分页只有在PageHelper.startPage(pageNum,pageSize)之后的数据库查询语句才起作用,原因是PageHelper的实现原理是在数据库查询过程中通过拦截器拦截处......
  • Java-List集合字段求和函数
    一、FunctionCustom通用求和函数使用示例二、求和函数修订记录版本是否发布2020-01-25v1.0是一、FunctionCustom通用求和函数使用示例特点:简化代码......
  • MapReduce核心原理(下)
    MapReduce中的排序MapTask和ReduceTask都会对数据按key进行排序。该操作是Hadoop的默认行为,任何应用程序不管需不需要都会被排序。默认排序是字典顺序排序,排序方法......