- Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作
- 使用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();
|
获取流的方法
- 根据List集合获取流
1 2 3 4 5 6
| List<String> list = new ArrayList<>(); list.add("一号"); list.add("二号"); list.add("三号"); Stream<String> stream1 = list.stream();
|
- 根据Set集合获取流
1
| Stream<String> stream2 = set.stream();
|
- 根据Map集合获取流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Map<Integer,String> map = new HashMap<>(); map.put(1,"一号"); map.put(2,"二号"); map.put(3,"三号");
Set<Integer> map1 = map.keySet(); Stream<Integer> stream3 = map1.stream();
Collection<String> map2 = map.values(); Stream<String> stream4 = map2.stream();
Set<Map.Entry<Integer, String>> map3 = map.entrySet(); Stream<Map.Entry<Integer, String>> stream5 = map3.stream();
|
- 根据数组获取流
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<>(); 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) { 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方法对该对象进行循环输出
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()
- 对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)); }
|
- 对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)); }
|
流的中间操作
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) .distinct() .skip(2) .limit(2); newStream.forEach(System.out::println);
|
Stream对象转换为集合
collect(Collectors.toList())
collect(Collectors.toSet())
collect(Collectors.toMap())