好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

基于list stream: reduce的使用实例

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

查看更多关于基于list stream: reduce的使用实例的详细内容...

  阅读:20次