Stream Api

Posted by lily on April 7, 2023

简介

  1. Stream 和 Collection 集合的区别:
    1. :Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
  2. Stream到底是什么
    1. 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
    2. “集合讲的是数据,Stream讲的是计算!”
    3. ①Stream 自己不会存储元素。
    4. ②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
    5. ③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

      stream流的使用

  •  **1- 创建 Stream **
    • 一个数据源(如:集合、数组),获取一个流
  •  **2- 中间操作 **
    • 一个中间操作链,对数据源的数据进行处理
  •  **3- 终止操作(终端操作) **
    • 一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用

      创建stream流

    1. 方式一:通过集合
      1. **default Stream stream() : 返回一个顺序流 **
      2. **default StreamparallelStream() : 返回一个并行流**
        Arrays.asList(1, 2, 3, 4, 5);
        
    2. 方式二:通过数组
      1. **static Stream stream(T[] array): 返回一个流**
      2. 重载形式,能够处理对应基本类型的数组:** **
        1.  public static IntStream stream(int[] array)
        2.  public static LongStream stream(long[] array)
        3.  public static DoubleStream stream(double[] array)
    3. 方式三:通过Stream的of()
      1. **public static Stream of(T... values) : 返回一个流**
    4. 方式四:创建无限流
      1. **迭代 public static Stream iterate(final T seed, final UnaryOperator f) **
      2. **生成 public static Streamgenerate(Supplier s) **

        中间操作

  • 多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止 操作,在终止操作时一次性全部处理,称为“惰性求值”
  • 中间操作方法链中调用的方法都有返回流.
    1. 筛选与切片 filter
    1. **filter(Predicate p) **接收 Lambda , 从流中排除某些元素
    2. **distinct() **筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
    3. **limit(long maxSize) **截断流,使其元素不超过给定数量
    4. **skip(long n) **跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一 个空流。与 limit(n) 互补
      1. 映射Map
    5. **map(Function f) **接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
    6. mapToDouble(ToDoubleFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream。
    7. mapToInt(ToIntFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 IntStream。
    8. **mapToLong(ToLongFunction f) **接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 LongStream。
    9. **flatMap(Function f) **接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流.
      1. 排序 sort
    10. **sorted() **产生一个新流,其中按自然顺序排序
    11. **sorted(Comparator com) **产生一个新流,其中按比较器顺序排序

      终止操作

  • 终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是 void
  • 流进行了终止操作后,不能再次使用。
  • 想要重新对原始数据进行流操作,需要获得新流
    1. 匹配与查找

image.pngimage.png

  1. 归约

image.png

  1. 收集

image.png

IntStream 类

  1. 给int数组按绝对值排序
    int[] nums = {-1, -2, 8, 2, 4};
    IntStream.of(nums).
     boxed().
     sorted((o1, o2)->Math.abs(o1) - Math.abs(o2)).
     mapToInt(Integer::intValue).toArray();