Java 8 Stream API

100 阅读2分钟

Stream 特点

  • stream 本身不会存储元素
  • stream 不会改变源对象。 相反,会返回一个持有结果的新对象
  • stream 操作时延时执行的,意思是stream对象只有在调用终止操作时,才会执行一系列中间操作。否则中间操作不执行

Stream执行流程

  1. 创建Stream实例
    • 通过集合创建
    • 通过数组创建:Arrays.stream()
    • 通过Stream的of方法
    • 通过Stream的iterate方法或者generate方法,创建无限流
        Stream.iterate(0, seed -> seed + 2).limit(10).forEach(System.out::println); 
        Stream.generate(Math::random).limit(10).forEach(System.out::println);
  1. 执行一系列中间操作
    • 筛选和切片
      filter: 从流中排除某些元素
      limit:使其元素不超过给定的数量
      skip:跳过指定数量的元素,如果流中元素的数量少于指定指定数量则返回一个空流(不是null,是流中一个元素都没有)
      distinct: 通过元素的hashcode和equals方法去除流中重复元素
    • 映射
      map: 将每个元素作用在map上
      flatmap: 将流中每个值转换成另外一个流,然后把所有流连成一个流
    • 排序
      sorted: 默认自然排序,也可以执行排序规则
  2. 执行终止操作
    • 匹配与查找
      allMatch: 检查规则是否匹配所有元素,返回布尔值
      anyMatch:检查规则是否匹配任意元素,返回布尔值
      noneMatch:检查规则没有匹配的元素,返回布尔值
      findFirst: 返回第一个元素
      findAny:返回当前流中任意元素
      count:返回流中的元素个数
      max:返回流中最大值
      min:返回流中最小值
      forEach:内部迭代
    • 归约
      reduce: 将流中的值反复结合起来,得到一个值,如求和操作
    • 收集
      collect:将流转换为其他形式
  3. 返回stream操作之后的结果,源对象没有改变