- Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作
- 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
基本使用
- Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象
- 比如
java
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流
获取流的方法
- 根据List集合获取流
java
// 创建List集合
List<String> list = new ArrayList<>();
list.add("一号");
list.add("二号");
list.add("三号");
Stream<String> stream1 = list.stream();
- 根据Set集合获取流
java
Stream<String> stream2 = set.stream();
- 根据Map集合获取流
java
// 创建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();
- 根据数组获取流
// 根据数组获取流
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是指集合里面的每一项
java
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()
- stream().map()提取List对象的某一列值。然后可以通过forEach方法对该对象进行循环输出
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集合进行排序
- 对id进行升序排序
java
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));
}
- 对id进行降序排序
java
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() 去除重复元素
java
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())
目录