聚合操作
聚合操作由管道和流构成。
聚合操作通过流来处理数据而不是通过集合,流是数据元素的序列,而集合是数据存储的数据结构,流通过管道携带来自源(如集合)得数据,管道是一系列操作,聚合操作接受lambda表达式作为参数。
管道
管道是一系列的聚合操作,包含以下 组件
- 源:可以是集合,数组,构造函数,输入输出通道
- 0个或者多个中间操作:部分中间操作会生成一个新的流,如filter
- 终端操作:终端操作会返回一个非流结果,如原始类型、集合或者没有返回值(如forEach)
流
- 流是元素序列
- 流不是存储数元素的数据结构,流通过管道从源携带值
聚合操作和迭代器的区别
- 聚合操作没有next方法
- 聚合操作更方便将问题划分为子问题,同时将结果组合到子问题中
- 聚合操作不直接处理集合中的元素,而是处理流中的元素
- 聚合操作支持将行为作为参数,如lambda表达式
流的常用操作
流的创建
java.util.stream.Stream
- public static Stream of(T... values) 产生一个元素为给定值的流
- public static Stream empty() 创建空的流
- public static Stream generate(Supplier<? extends T> s) 产生一个无限流,通过反复调用函数s而构建的
- public static Stream iterate(final T seed, final UnaryOperator f)
- public static Stream iterate(T seed, Predicate<? super T> hasNext, UnaryOperator next) 产生一个无限流,他的元素包含seed,在seed上调用f产生的值、在前一个元素上调用f产生的值,用f产生的值等等。第一个方法会产生一个无限流,而第二个方法的流会在碰到第一个不满足hasNext谓词的元素时终止
- public static Stream ofNullable(T t) 如果t为null则返回一个空流,否则返回包含t的流
java.util.Spliterators
- public static Spliterator spliteratorUnknownSize(Iterator<? extends T> iterator,
int characteristics) 用给定的特性将一个迭代器转换为一个具有未知尺寸的可分割的迭代器
java.util.Arrays
- public static Stream stream(T[] array, int startInclusive, int endExclusive) 产生一个流,他的元素是由数组中指定范围内的元素构成的
java.util.regex.Pattern
- public Stream splitAsStream(final CharSequence input) 产生一个流,他的元素是由输入中该模式界定的部分
java.nio.file.Files
- public static Stream lines(Path path, Charset cs) 产生一个流,他的元素是指定文件中的行,改为间的字符集默认为UTF-8,或者为指定的字符集
java.util.stream.StreamSupport
- public static Stream stream(Spliterator spliterator, boolean parallel) 产生一个流,它包含了由给定部分的可分割迭代器产生的值
java.util.Scanner
- public Stream tokens() 产生一个字符串流,该字符串是调用这个扫描器的next方法时返回的
filter、map和flatMap
- Stream filter(Predicate<? super T> predicate) 产生一个流,它包含当前流中所有满足谓词条件的元素
- Stream map(Function<? super T, ? extends R> mapper) 产生一个流,他包含mapper应用于当前流中所有元素所产生的结果
- Stream flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) 产生一个流,它通过将mapper应用于当前流中所有元素所产生的结果连接到一起而获得的(这里的每个结果都是一个流,及产生的流中包含多个子流)
抽取子流和组合流
- Stream limit(long maxSize) 产生一个流,其中包含了当前流中最初的maxSize个元素
- Stream skip(long n) 产生一个流,他的元素时当前流中除了前n个元素之外的所有元素
- default Stream takeWhile(Predicate<? super T> predicate) 产生一个流,他的元素时当前流中所有满足谓词条件的元素
- default Stream dropWhile(Predicate<? super T> predicate) 产生一个流,他的元素是当前流中符合谓词条件的元素之外的所有元素
- public static Stream concat(Stream<? extends T> a, Stream<? extends T> b) 产生一个流,他的元素是a的元素后面跟着b的元素
其他的流转换