什么是 Stream
Stream(流)是一个来自数据源的元素队列并支持聚合操作
- 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
如何生成流
- 通过集合生成
Stream<String> stream = Arrays.asList("a", "b", "c", "d", "e").stream();
- 通过数组生成
Stream<String> stream = Arrays.stream(new String[]{"a", "b", "c", "d", "e"});
- 通过值生成
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
流的使用
- forEach 迭代流中的每个数据
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 这里的.stream()可以省略
strings.stream().forEach(System.out::println);
- map 用于映射每个元素到对应的结果 以下代码将string转为int输出
List<String> strings = Arrays.asList("1", "2", "3", "4", "5","6");
strings.stream().map(Integer::parseInt).forEach(System.out::println);
- filter 用于通过设置的条件过滤出元素 以下代码过滤出集合中大于1并且小于11的数字
List<Integer> integers = Arrays.asList(7, 0, 2, 8, 20, 12, 20);
integers.stream().filter(s -> s > 1 && s < 11).forEach(System.out::println);
- distinct 快速去除集合中相同的值
Stream.of(1, 1, 2, 3, 4, 5).distinct().forEach(System.out::println);
- collect Collector 封装了用作 collect(Supplier, BiConsumer, BiConsumer) 的参数的函数,允许重用收集策略和组合收集操作,例如多级分组或分区。
// 以下会将字符串累积到 ArrayList 中
List<String> asList = stringStream.collect(Collectors.toList());
// 下面将按城市对 Person 对象进行分类
Map<String, List<Person>> peopleByCity = personStream.collect(Collectors.groupingBy(Person::getCity));
- joining 拼接流中的元素 以下代码以逗号分割输出
List<String> strings = Arrays.asList("2018", "2019", "2021", "2022", "2023");
System.out.println(strings.stream().collect(Collectors.joining(",")));
进阶用法
- 对象集合转map
List<UserEntity> userList = new ArrayList<>();
Map<Long, UserEntity> userMap = userList.stream().collect(Collectors.toMap(UserEntity::getId, Function.identity()));
- 批量修改集合对象中的值 (keep 和 map 的区别在于 keep默认返回当前对象 map 可以自定义)
List<UserEntity> userList = new ArrayList<>();
userList = userList.stream().peek(user->{
user.setUsername("ibobo");
}).collect(Collectors.toList());