简介
- Stream 和 Collection 集合的区别:
- :Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
- Stream到底是什么
- **1- 创建 Stream **
- 一个数据源(如:集合、数组),获取一个流
- **2- 中间操作 **
- 一个中间操作链,对数据源的数据进行处理
- **3- 终止操作(终端操作) **
- 方式一:通过集合
- **default Stream
stream() : 返回一个顺序流 ** - **default Stream
parallelStream() : 返回一个并行流** Arrays.asList(1, 2, 3, 4, 5);
- **default Stream
- 方式二:通过数组
- **static
Stream stream(T[] array): 返回一个流** - 重载形式,能够处理对应基本类型的数组:** **
- public static IntStream stream(int[] array)
- public static LongStream stream(long[] array)
- public static DoubleStream stream(double[] array)
- **static
- 方式三:通过Stream的of()
- **public static
Stream of(T... values) : 返回一个流**
- **public static
- 方式四:创建无限流
- 方式一:通过集合
- 多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止 操作,在终止操作时一次性全部处理,称为“惰性求值”。
- 中间操作方法链中调用的方法都有返回流.
- 筛选与切片 filter
- **filter(Predicate p) **接收 Lambda , 从流中排除某些元素
- **distinct() **筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
- **limit(long maxSize) **截断流,使其元素不超过给定数量
- **skip(long n) **跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一 个空流。与 limit(n) 互补
- 映射Map
- **map(Function f) **接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
- mapToDouble(ToDoubleFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream。
- mapToInt(ToIntFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 IntStream。
- **mapToLong(ToLongFunction f) **接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 LongStream。
- **flatMap(Function f) **接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流.
- 排序 sort
- **sorted() **产生一个新流,其中按自然顺序排序
- **sorted(Comparator com) **产生一个新流,其中按比较器顺序排序
终止操作
- 终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是 void 。
- 流进行了终止操作后,不能再次使用。
- 想要重新对原始数据进行流操作,需要获得新流
- 匹配与查找
- 归约
- 收集
IntStream 类
- 给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();