1. Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作
  2. 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

基本使用

  • Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象
  • 比如
1
2
3
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流

获取流的方法

  1. 根据List集合获取流
1
2
3
4
5
6
// 创建List集合
List<String> list = new ArrayList<>();
list.add("一号");
list.add("二号");
list.add("三号");
Stream<String> stream1 = list.stream();
  1. 根据Set集合获取流
1
Stream<String> stream2 = set.stream();
  1. 根据Map集合获取流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 创建Map集合
Map<Integer,String> map = new HashMap<>();
map.put(1,"一号");
map.put(2,"二号");
map.put(3,"三号");

// 根据Map集合的键获取流
Set<Integer> map1 = map.keySet();
Stream<Integer> stream3 = map1.stream();
// 根据Map集合的值获取流
Collection<String> map2 = map.values();
Stream<String> stream4 = map2.stream();
// 根据Map集合的键值对对象获取瑞
Set<Map.Entry<Integer, String>> map3 = map.entrySet();
Stream<Map.Entry<Integer, String>> stream5 = map3.stream();
  1. 根据数组获取流
1
2
3
// 根据数组获取流
String[] arr = {"一号","二号","三号"};
Stream<String> stream6 = Stream.of(arr);

Stream流的常用方法

.collect(Collectors.toList())

  • 使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合
  • 使用filter()函数之后也可以通过该方法得到集合。
  • Collectors.toList() 用来结束Stream流

stream().filter()

stream().filter()一般适用于list集合,主要作用就是条件查询,从集合中查询想要的数据。filter里面的参数user是指集合里面的每一项

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
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamDemo {
public static void main(String[] args) {
List<User> list = new ArrayList<>();
//创建3个对象
User u1 = new User();
u1.setAge(23);
u1.setName("xiaoming");
u1.setId(123456);

User u2 = new User();
u2.setAge(26);
u2.setName("xiaofang");
u2.setId(77777);

User u3 = new User();
u3.setAge(18);
u3.setName("honghong");
u3.setId(11111);
//添加对象到集合
list.add(u1);
list.add(u2);
list.add(u3);
//条件筛选
compare(list);

}

private static void compare(List<User> list) {
//在集合中查询用户名为xiaofang的集合
List<User> userList = list.stream().filter(user -> "xiaofang" .equals(user.getName())).collect(Collectors.toList());

System.out.println(list);
System.out.println(userList);

List<User> userList1 = list.stream().filter(user -> user.getAge() > 19 && user.getAge() < 24).collect(Collectors.toList());
System.out.println(userList1);
}
}

filter:筛选(里面输入的筛选的条件( user -> “xiaofang”.equals(user.getName()) )),这里的条件是查询uesr对象中name属性。

stream().map()

  1. stream().map()提取List对象的某一列值。然后可以通过forEach方法对该对象进行循环输出
1
2
3
4
5
6
private static void printList(List<User> list) {
List<String> userList = list.stream().map(User::getName).collect(Collectors.toList());

userList.forEach(u -> System.out.println(u));
}

stream().sorted()

  • 对list集合进行排序
  1. 对id进行升序排序
1
2
3
4
5
private static void printSortList(List<User> list) {
// 升序排序
List<User> userList = list.stream().sorted(Comparator.comparing(User::getId)).collect(Collectors.toList());
userList.forEach(u -> System.out.println(u));
}
  1. 对id进行降序排序
1
2
3
4
5
6
private static void printSortList(List<User> list) {
// 降序排序
List<User> userList = list.stream().sorted(Comparator.comparing(User::getId).reversed()).collect(Collectors.toList());
userList.forEach( u - >System.out.println(u));
}

流的中间操作

  • 筛选与切片
    filter:过滤流中的某些元素
    limit(n):获取n个元素
    skip(n):跳过n元素,配合limit(n)可实现分页
    distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素
    
1
2
3
4
5
6
7
Stream<Integer> stream = Stream.of(6, 4, 6, 7, 3, 9, 8, 10, 12, 14, 14);

Stream<Integer> newStream = stream.filter(s -> s > 5) //6 6 7 9 8 10 12 14 14
.distinct() //6 7 9 8 10 12 14
.skip(2) //9 8 10 12 14
.limit(2); //9 8
newStream.forEach(System.out::println);

Stream对象转换为集合

  • collect(Collectors.toList())

  • collect(Collectors.toSet())

  • collect(Collectors.toMap())