我是靠谱客的博主 微笑钢铁侠,这篇文章主要介绍基于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; } }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持靠谱客。

最后

以上就是微笑钢铁侠最近收集整理的关于基于list stream: reduce的使用实例的全部内容,更多相关基于list内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(120)

评论列表共有 0 条评论

立即
投稿
返回
顶部