Java8 Stream API 常用方法

以下面的 User 类和 userList 为例:

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
public class User {

private int userId;

private String userName;

private int age;

private String address;

public User(int userId, String userName, int age, String address) {
this.userId = userId;
this.userName = userName;
this.age = age;
this.address = address;
}

}


List<User> userList = new ArrayList<>();
userList.add(new User(1, "aa", 20, "shenzhen"));
userList.add(new User(2, "bb", 20, "guangzhou"));
userList.add(new User(3, "cc", 21, "foshan"));
userList.add(new User(4, "dd", 22, "zhongshan"));

注意:使用Stream API,要求 List 不为 null,但可以为空

以下面代码为例,若 userList 为空,则出来的 userIdList 也为空,但不为 null。

1
2
3
if (userList != null){
List<Integer> userIdList = userList.stream().map(User::getUserId).collect(Collectors.toList());
}

取一个属性组成List或Set

从userList中取userId组成List或Set:

1
List<Integer> userIdList = userList.stream().map(User::getUserId).collect(Collectors.toList());

若要得到 Set,最后换成Collectors.toSet()

取两个属性组成Map

从userList中取userId和userName组成Map:

1
Map<Integer, String> userIdNameMap = userList.stream().collect(Collectors.toMap(User::getUserId, User::getUserName));

按一个属性分组,组成 key=属性,value=该属性下的list的Map

从userList中按address分组,组成 key=address,value=该address下的UserList的Map:

1
Map<String, List<User>> addrMap = userList.stream().collect(Collectors.groupingBy(User::getAddress));

按一个属性分组,组成 key=属性,value=另一个属性list的Map

从userList中按address分组,组成 key=address,value=userIdList的Map:

1
2
3
Map<String, List<Integer>> addrMap = userList.stream().collect(
Collectors.groupingBy(User::getAddress, Collectors.mapping(User::getUserId, Collectors.toList()))
);

按多个属性分组

从userList中按address和age分组,组成 key=address,value=该address下的UserList的Map,将 address 和 age 属性拼接成一个字符串,以这个字符串做分组:

1
Map<String, List<User>> map = userList.stream().collect(Collectors.groupingBy(user -> user.getAddress() + "_" + user.getAge()));

按照属性值查找一个元素

从userList中查找age=20的第一个人/某个人:

1
2
3
4
5
6
7
8
9
10
11
// 第一个
Optional<User> first = userList.stream().filter(user -> user.getAge() == 20).findFirst();
if (first.isPresent()) {
System.out.println("first: " + first.get());
}

// 任何一个
Optional<User> any = userList.stream().filter(user -> user.getAge() == 20).findAny();
if (any.isPresent()) {
System.out.println("any: " + any.get());
}

按照属性值查找所有元素

从userList中查找age=20的所有user列表:

1
List<User> userList1 = userList.stream().filter(user -> user.getAge() == 20).collect(Collectors.toList());