概述
Stream API (java.util.stream) 把真正的函数式编程风格引入到 Java 中 这是目前为止对 Java 类库最好的补充, 因为 Stream API 可以极大提供 Java 程序员的生产力, 让程序员写出高效率、干净、简洁的代码 Stream 是 Java8 中处理集合的关键抽象概念, 它可以指定你希望对集合进行的操作, 可以执行非常复杂的查找、过滤和映射数据等操作. 使用 Stream API 对集合数据进行操作, 就类似于使用 SQL 执行的数据库查询. 也可以使用 Stream API 来并行执行操作. 简言之, Stream API 提供了一种高效且易于使用的处理数据的方式.
为什么要使用 Stream API?
实际开发中, 项目中多数数据源都来自于 Mysql, Oracle 等. 但现在数据源可以更多了, 有 MongoDB, Redis 等, 而这些 NoSQL 的数据就需要 Java 层面去处理. Stream 和 Collection 集合的区别; Collection 是一种静态的内存数据结构, 而 Stream 是有关计算的. 前者是主要面向内存, 存储在内存中, 后者主要是面向 CPU, 通过 CPU 实现计算.
怎么使用
Stream 的实例化
通过集合
1. default Stream<E> stream(): 返回一个顺序流
2. default Stream<E> parallelStream(): 返回一个并行流
通过数组 (使用 Arrays 工具类)
1. Arrays.stream(...)
使用 Stream API
1. Stream.of()
2. Stream.iterate()
3. Stream.generate()
Stream 的中间操作
筛选与切片
1. filter(Predicate p): 按照指定规则, 从流中过滤某些元素
2. distinct(): 筛选, 通过元素的 hashCode() 和 equals() 去重
3. limit(long maxSize): 截断流, 返回指定数量的元素
4. skip(long n): 跳过元素, 返回一个扔掉了前 n 个元素的流, 若流中元素不足 n 个, 返回一个空流
映射
1. map(Function f): 接收一个函数, 然后应用到每个元素上, 映射成一个新的元素
2. mapToDouble(ToDoubleFunction f): 接收一个函数, 然后应用到每个元素上, 产生一个新的 DoubleStream
3. mapToInt(ToIntFunction f): 接收一个函数, 然后应用到每个元素上, 产生一个新的 IntStream
4. mapToLong(ToLongFunction f): 接收一个函数, 然后应用到每个元素上, 产生一个新的 LongStream
5. flatMap(Function f): 接收一个函数作为参数, 将流中的每个值都换成另一个流, 然后把所有流连接成一个流
排序
1. sorted(): 产生一个新流, 其中按自然顺序排序
2. sorted(Comparator com): 产生一个新流, 其中按比较器规则排序
Stream 的终止操作
匹配与查找
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): 迭代
规约
1. reduce(T iden, BinaryOperator b): 可以将流中的元素反复结合起来, 得到一个值, 返回 T.
2. reduce(BinaryOperator b): 可以将流中的元素反复结合起来, 得到一个值, 返回 Optional<T>.
收集
1. collect(Collector): Stream API 提供一个 Collectors 工具类, 该类提供了很多种收集方法