ZB-032-01Stream入门

Stream

什么是Stream

  • ⼀个“流”
  • 不易出错
  • 简化代码
  • 可读性/可维护性++

Stream的API-中间操作

  • 仍然返回Stream的操作
  • filter
  • map
  • sorted

Stream的API-终结操作

  • 返回⾮Stream的操作,包括void
  • ⼀个流只能被消费⼀次
  • forEach
  • count/max/min
  • findFirst/findAny
  • anyMatch/noneMatch
  • ⭐collect

例子

  • 过滤姓张的用户
  • 按年龄排序
  • 把它们的名字汇总到 List 里
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import java.util.*;
import java.util.stream.Collectors;

public class Main {
static class User{
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

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 static void main(String[] args) {
// 把姓张的用户 挑出来,按照年龄排序,然后把它们的 名字 报告给我
List<User> users = Arrays.asList(new User("张三",20),new User("张三疯",15),new User("李四",100));

// java 7
List<String> zhangUsers = getZhangUsers(users);

// java8 stream来实现
//创建 stream ===> users.stream() 把 users 里的内容放在 河流里
// 从上到下流淌着 创建流之后我们可以进行若干个中间操作
/*
中间操作有什么? 中间操作仍然返回一个流
filter(接收一个 Predicate)
map 把一个流内(布满了 User user) 转换为 另一个流(如 布满了 String name) 传递一个 从一个类型到另一个类型的 抽象的函数映射
sorted
*/
// 过滤姓张的
//users.stream().filter(user->user.name.startsWith("张"))

// 按照年龄排序
// users.stream().filter(user->user.name.startsWith("张")).sorted(Comparator.comparing(User::getAge))

// 生成 name的映射
// users.stream().filter(user->user.name.startsWith("张")).sorted(Comparator.comparing(User::getAge)).map(User::getName)

// 将河流的内容 返回到集合里
// 终结操作 只能有一个用完就销毁了 ,一个流只能消费一次
// 所有返回非 Stream 的操作 包括 void 都是终结操作
/*
forEach
count/max/min
findFirst/FindAny
anyMatch/noneMatch
collect
*/


// collect
users.stream().filter(user->user.name.startsWith("张"))
.sorted(Comparator.comparing(User::getAge))
.map(User::getName)
.collect(Collectors.toList());

/*
过滤后的 stream 会被 塞回 原 list吗? 不会
stream 只能被消费一次,一旦被消费,就没了,即使你保存之前的引用
*/
}

public static List<String> getZhangUsers(List<User> users){
List<User> zhangUsers = new ArrayList<>();

for (User user: users) {
if(user.name.startsWith("张")){
zhangUsers.add(user);
}
}
Collections.sort(zhangUsers, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
if(o1.age - o2.age < 0){
return -1;
}else if(o1.age - o2.age > 0){
return 1;
}else {
return 0;
}
}
});

List<String> names = new ArrayList<>();

for (User user:zhangUsers) {
names.add(user.name);
}
return names;
}
}

IDEA Stream插件

  • 搜索 stream

debug的时候 多了一个小图标 Trace Current Stream Chain (跟踪当前的流链)

参考链接