简单了解为什么需要 Stream
Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。
什么是聚合操作
在传统的 J2EE 应用中,Java 代码经常不得不依赖于关系型数据库的聚合操作来完成诸如:
客户每月平均消费金额
最昂贵的在售商品
本周完成的有效订单(排除了无效的)
取十个数据样本作为首页推荐
这类的操作。
举例说明
但在当今这个数据大爆炸的时代,在数据来源多样化、数据海量化的今天,很多时候不得不脱离 RDBMS,或者以底层返回的数据为基础进行更上层的数据统计。而 Java 的集合 API 中,仅仅有极少量的辅助型方法,更多的时候是程序员需要用 Iterator 来遍历集合,完成相关的聚合应用逻辑。这是一种远不够高效、笨拙的方法。
类
public interface Stream<T> extends BaseStream<T,Stream<T>>
方法概要
修饰符和类型 | 方法 | 说明 |
---|---|---|
boolean | allMatch(Predicate<? super T> predicate) | 返回此流的所有元素是否与提供的谓词匹配。 |
boolean | anyMatch(Predicate<? super T> predicate) | 返回此流的任何元素是否与提供的谓词匹配 |
static <T> Stream.Builder<T> | builder() | 返回的构建器Stream 。 |
<R,A> R | collect(Collector<? super T,A,R> collector) | 使用对此流的元素执行可变还原操作 Collector 。 |
<R> R | collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner) | 在此流的元素上执行可变的归约运算。 |
static <T> Stream<T> | concat(Stream<? extends T> a, Stream<? extends T> b) | 创建一个延迟串联的流,其元素是第一个流的所有元素,然后是第二个流的所有元素。 |
long | count() | 返回此流中的元素计数。 |
Stream<T> | distinct()
| 返回由该流的不同元素组成的流(根据 Object.equals(Object) )。 |
static <T> Stream<T> | empty() | 返回一个空序列Stream 。 |
Stream<T> | filter(Predicate<? super T> predicate) | 返回一个流,该流包含与给定谓词匹配的该流的元素。 |
Optional<T> | findAny() 返回 | |
Optional<T> | findFirst() 返回 | |
<R> Stream<R> | flatMap(Function<? super T,? extends Stream<? extends R>> mapper) 返回一个流,该流包括将流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容而得到的结果。 | |
DoubleStream | flatMapToDouble(Function<? super T,? extends DoubleStream> mapper) 返回一个 | |
IntStream | flatMapToInt(Function<? super T,? extends IntStream> mapper) 返回一个 | |
LongStream | flatMapToLong(Function<? super T,? extends LongStream> mapper) 返回一个 | |
void | forEach(Consumer<? super T> action) 为此流的每个元素执行一个动作。 | |
void | forEachOrdered(Consumer<? super T> action) 如果流具有定义的遇到顺序,则按流的遇到顺序对此流的每个元素执行操作。 | |
static <T> Stream<T> | generate(Supplier<T> s) 返回无限的顺序无序流,其中每个元素都由提供的生成 | |
static <T> Stream<T> | iterate(T seed, UnaryOperator<T> f) 返回一个无限连续有序 | |
Stream<T> | limit(long maxSize) 返回由该流的元素组成的流,其 | |
<R> Stream<R> | map(Function<? super T,? extends R> mapper) 返回一个流,该流包括将给定函数应用于此流的元素的结果。 | |
DoubleStream | mapToDouble(ToDoubleFunction<? super T> mapper) 返回 | |
IntStream | mapToInt(ToIntFunction<? super T> mapper) 返回 | |
LongStream | mapToLong(ToLongFunction<? super T> mapper) 返回 | |
Optional<T> | max(Comparator<? super T> comparator) 根据提供的返回此流的最大元素 | |
Optional<T> | min(Comparator<? super T> comparator) 根据提供的返回此流的最小元素 | |
boolean | noneMatch(Predicate<? super T> predicate) 返回此流中是否没有元素与提供的谓词匹配。 | |
static <T> Stream<T> | of(T... values) 返回其元素为指定值的顺序有序流。 | |
static <T> Stream<T> | of(T t) 返回 | |
Stream<T> | peek(Consumer<? super T> action) 返回由该流的元素组成的流,并在从结果流中消耗元素时对每个元素另外执行提供的操作。 | |
Optional<T> | reduce(BinaryOperator<T> accumulator) | |
T | reduce(T identity, BinaryOperator<T> accumulator) | |
<U> U | reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner) 执行减少有关此流的元件,使用所提供的身份,积累和组合功能。 | |
Stream<T> | skip(long n) 在丢弃流的第一个 | |
Stream<T> | sorted() 返回由该流的元素组成的流,并根据自然顺序排序。 | |
Stream<T> | sorted(Comparator<? super T> comparator) 返回由该流的元素组成的流,并根据提供的进行排序 | |
Object[] | toArray() 返回包含此流元素的数组。 | |
<A> A[] | toArray(IntFunction<A[]> generator) 返回一个包含此流元素的数组,使用提供的 |