Stream API

Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简言之,Stream API提供了一种高效且易于使用的处理数据的方式

Collection集合和Stream的区别

Collection是一种静态的内存数据结构,而Stream是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向CPU,通过CPU实现计算。

Stream是什么

是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列

“集合讲的是数据,Stream讲的是计算”

注意

  1. Stream自己不会存储元素
  2. Stream不会改变源对象。会返回一个持有结果的新Stream
  3. Stream操作是延迟执行的,意味着会等到需要结果时候才会执行

1-创建Stream

一个数据源(如:集合、数组),获取一个流

  1. 创建Stream方式一:通过集合
    1. default Stream
    2. default Stream
  2. 创建Stream方式二:通过数组
    1. static
    2. 重载形式,能够处理对应基本类型的数组:
      1. public static IntStream stream(int[] array)
      2. public static LongStream stream(long[] array)
      3. public static DoubleStream stream(double[] array)
  3. 创建Stream方式三:通过Stream的of()
    1. 可以调用Stream类静态方法of(),通过显示值创建一个流。它可以接收任意数量的参数
    2. public static
  4. 创建Stream方式四[了解]:创建无限流
    1. 可以使用静态方法 Stream.iterate()和Stream.generate(),创建无限流
    2. 迭代: public static
    3. 生成: public static

2-中间操作

一个中间操作链,对数据源的数据进行处理(过滤、映射。。。)

多个中间操作可以连接来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理。而在终止操作时一次性全部处理,称为“惰性求值”

1. 筛选与切片

  1. filter(Predicate p):接受Lambda,从流中排除某些元素
  2. distinct():筛选,通过流所生成元素的hashCode()和equals()去除重复元素
  3. limit(long maxSize):截断流,使其元素不超过给定数量
  4. skip(long n):跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补

2. 映射

  1. map(Function f):接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
  2. mapToDouble(ToDoubleFunction f):接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的DoubleStream
  3. mapToInt(ToIntFunction f):接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的IntStream
  4. mapToLong(ToLongFunction f):接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的LongStream
  5. flatMap(Function f):接受一个函数作为参数,将流中每个值都换成另一个流,然后把所以流连接成一个流

3.排序

  1. sorted():产生一个新流,其中按自然顺序排序
  2. sorted(Comparator com):产生一个新流,其中按比较器顺序排序

3-终止操作(终端操作)

一旦执行终止操作,就执行中间操作链,并产生结果。之后,会在被使用。

  1. 匹配与查找:
    1. allMatch(Predicate p):检查是否匹配所有元素
    2. anyMatch(Predicate p):检查是否至少匹配一个元素
    3. noneMatch(Predicate p):检查是否没有匹配所有元素
    4. findFirst():返回第一个元素
    5. findAny():返回当前流中的任意元素
    6. count():返回流中元素总数
    7. max(Comparator c):返回流中最大值
    8. min(Comparator c):返回流中最小值
    9. forEach(Consumer c): 内部迭代(使用Collection接口需要用户去做迭代,称为外部迭代。相反Stream ApI使用内部迭代——它帮你迭代)
  2. 归约:
    1. reduce(T iden, BinaryOperator b): 可以将流中元素反复结合起来,得到一个值。返回T
    2. reduce(BinaryOperator b): 可以将流中元素反复结合起来,得到一个值,返回Optional
    3. 备注:map和reduce连接常被称为map-reduce模式,因Google用它来进行网络搜索而出名
  3. 收集:
    1. collect(Collector c):将流转换为其他形式,接受一个Collector接口的实现,用于给Stream中元素做汇总的方法
    2. Collector接口中方法的实现决定了如何对流执行收集的操作(如收集到List、Set、Map)
    3. 另外,Collectors实用类提供了很多静态方法,可以方便地创建地创建收集器实例

本文章使用limfx的vscode插件快速发布