JAVA 8 Stream流操作

JAVA / 2022-08-26

什么是 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());