我是靠谱客的博主 粗暴长颈鹿,这篇文章主要介绍java8-常用stream操作(1),现在分享给大家,希望可以做个参考。

前言

java8的Stream 流式操作,用于对集合进行投影、转换、过滤、排序、去重等,更进一步地说,这些操作能链式串联在一起使用,类似于 SQL 语句,可以大大简化代码。下面我就将平时常用的一些stream操作做一些汇总。

通过 IntStream 构造基本类型的流

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//在java8之前,遍历0-99的基本操作 for(int i = 0;i<100;i++){ System.out.println("i:"+i); } //使用IntStream串行遍历 IntStream.rangeClosed(0,99).forEach(i->{ System.out.println("i:"+i); }); //使用IntStream并行遍历 IntStream.rangeClosed(0,99).parallel().forEach(i->{ System.out.println("i:"+i); });

定义一个学生的结构体,为后续操作做准备

复制代码
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
class Student{ private String name; private int age; private int score; private String city; public Student(String name, int age, int score, String city) { this.name = name; this.age = age; this.score = score; this.city = city; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && score == student.score && Objects.equals(name, student.name) && Objects.equals(city, student.city); } @Override public int hashCode() { return Objects.hash(name, age, score, city); } @Override public String toString() { return "Student{" + "name='" + name + ''' + ", age=" + age + ", score=" + score + ", city='" + city + ''' + '}'; } } //构造数据 List<Student> students = new ArrayList<>(); students.add(new Student("stu001",18,70,"合肥")); students.add(new Student("stu001",18,70,"合肥")); students.add(new Student("stu002",23,80,"郑州")); students.add(new Student("stu003",45,90,"郑州")); students.add(new Student("stu004",32,73,"合肥")); students.add(new Student("stu005",66,76,"南京")); students.add(new Student("stu006",34,79,"杭州")); students.add(new Student("stu007",28,90,"合肥")); students.add(new Student("stu008",19,100,"杭州"));

filter

根据特定的条件进行过滤

复制代码
1
2
3
//filter 实现过滤操作,这边过滤出年龄大于30的学生 students.stream().filter(s->s.getAge()>30).forEach(System.out::println);

map

元素进行转化

复制代码
1
2
3
//map 对流每一个元素进行转化,将student的age转化成流 students.stream().map(Student::getAge).forEach(System.out::println);

sort 排序

根据条件进行排序操作

复制代码
1
2
3
4
//sort 按年龄排序,倒序 students.stream().sorted(Comparator.comparing(Student::getAge).reversed()).forEach(System.out::println);

distinct 去重

对流元素进行去重操作

复制代码
1
2
3
//distinct 去重,因为实现了hashcode和equals,名称为stu001的学生重复了 students.stream().distinct().forEach(System.out::println);

将集合组成一个list

复制代码
1
2
students.stream().map(Student::getAge).collect(Collectors.toList()).forEach(System.out::println);

将集合组成一个set

复制代码
1
2
students.stream().map(Student::getAge).collect(Collectors.toSet()).forEach(System.out::println);

最大值

求出年龄最大的学生

复制代码
1
2
System.out.println(students.stream().max(Comparator.comparingInt(Student::getAge)).get());

最大值

求出年龄最最小的学生

复制代码
1
2
System.out.println(students.stream().min(Comparator.comparingInt(Student::getAge)).get());

join操作

按照逗号进行join,用[]包裹起来

复制代码
1
2
3
//join操作,姓名join System.out.println(students.stream().map(Student::getName).collect(Collectors.joining(",","[","]")));

toMap操作

根据指定key,value生成一个map

复制代码
1
2
students.stream().collect(Collectors.toMap(Student::getName,student -> student,(x1,x2)->x2)).entrySet().forEach(System.out::println);

groupingBy

根据城市对学生进行分组

复制代码
1
2
3
4
5
students.stream().collect(Collectors.groupingBy(Student::getCity)) .forEach((k,v)->{ System.out.println(k+" = "+v); });

根据城市对学生进行分组,统计每个分组的count

复制代码
1
2
3
4
5
students.stream().collect(Collectors.groupingBy(Student::getCity,Collectors.counting())) .forEach((k,v)->{ System.out.println(k+" = "+v); });

统计每个分组的分数平均值

复制代码
1
2
3
4
5
students.stream().collect(Collectors.groupingBy(Student::getCity,Collectors.averagingInt(Student::getScore))) .forEach((k,v)->{ System.out.println(k+" = "+v); });

分组之转换分组结果List -> List

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
students.stream().collect( Collectors.groupingBy(Student::getCity, Collectors.mapping(Student::getName, Collectors.toList()))) .forEach((k,v)->{ System.out.println(k+" = "+v); }); //打印结果 // 合肥 = [stu001, stu001, stu004, stu007] // 郑州 = [stu002, stu003] // 杭州 = [stu006, stu008] // 南京 = [stu005]

自定义key

复制代码
1
2
3
4
5
students.stream().collect(Collectors.groupingBy(student -> "key_"+student.getCity())) .forEach((k,v)->{ System.out.println(k+" = "+v); });

最后

以上就是粗暴长颈鹿最近收集整理的关于java8-常用stream操作(1)的全部内容,更多相关java8-常用stream操作(1)内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部