Java8新特性之Stream流

发布时间 2023-07-17 14:44:07作者: 蓝光水母

Stream流感觉是我本人听的最多的Java8新特性了,但我感觉听得多,真要将他的用法,还是讲不出来,看来还是用的太少了。

  1. stream流的创建
  • 通过Stream.of()静态方法创建
// of为Stream的静态方法
Stream<String> strStream = Stream.of("hello", "java8", "stream");
// 或者使用基本类型流
IntStream intStream = IntStream.of(1, 2, 3);
  • 通过集合.stream创建
  • 通过数组创建 Arrays.stream
  • 迭代器创建
// 生成100个奇数,加上limit否则就是无限流了
Stream<Integer> stream = Stream.iterate(1, n -> n + 2).limit(100);
stream.forEach(System.out::println);
  • 用IO
// 获取指定路径下文件信息,list方法返回Stream类型
Stream<Path> pathStream = Files.list(Paths.get("/"));
  1. Stream流的常用操作
  • .Map()
    将流中每个数据映射出来
// 初始化一个不可变字符串
List<String> words = ImmutableList.of("hello", "java8", "stream");
// 计算列表中每个单词的长度
List<Integer> list = words.stream()
        .map(String::length)
        .collect(Collectors.toList());
// output: 5 5 6
list.forEach(System.out::println);
  • .flatMap()
    将流中每个元素取出来转成另外一个输出流,再通过扁平化形成一个流
Stream<String> strStream = words.stream()
        .map(word -> word.split("-"))
        .flatMap(Arrays::stream)
        .distinct();
// output: hello java8 stream
strStream.forEach(System.out::println);

因为.split会将其拆分为String[]故使用flatMap

  • filter()
    顾名思义,通过条件过滤流数据
  • 终端操作,即将stream流转换成具体的返回值
// 找出最大的值
List<Integer> integers = Arrays.asList(6, 20, 19);
integers.stream()
        .max(Integer::compareTo)
        .ifPresent(System.out::println);
// output: 20
  1. Stream流的天坑
  • stream流不能重复消费
List<String> strings = Arrays.asList("hello", "java8", "stream");
Stream<String> stream = strings.stream();
stream.forEach(System.out::println); // ok
stream.forEach(System.out::println); // IllegalStateException
  • Stream流的数据不可中途修改
List<String> strings = Arrays.asList("hello", "java8", "stream");
// expect: HELLO JAVA8 STREAM WORLD, but throw UnsupportedOperationException
strings.stream()
        .map(s -> {
            strings.add("world");
            return s.toUpperCase();
        }).forEach(System.out::println);

stream流我个人理解是类似于lambda语句的高大上简洁代码格式,看的人赏心悦目