Stream API 是对数据源的元素支持聚合操作
1. 生成 Stream Source
-
Collection.steam() 为集合创建串行流
-
Collection.parallelStream() 为集合创建并行流, 集合元素越多, 使用的资源越多.
-
Arrays.stream(T array) or Stream.of()
-
java.io.BufferedReader.lines()
-
java.util.stream.IntStream.range()
-
java.nio.file.Files.walk()
-
java.util.Spliterator
-
Random.ints()
-
BitSet.stream()
-
Pattern.splitAsStream(java.lang.CharSequence)
-
JarFile.stream()
2. stream 操作
流的操作分 3 种:
-
Intermediate
一个流可以后面跟随零个或多个 intermediate 操作.
其目的主要是打开流, 做出某种程度的数据映射/过滤, 然后返回一个新的流, 交给下一个操作使用.
这类操作都是惰性化的(lazy), 就是说, 仅仅调用到这类方法, 并没有真正开始流的遍历.- map (mapToInt, flatMap 等)
- mapToInt
转换成一个 int 数组后, 可使用summaryStatistics()返回IntSummaryStatistics对象, 进行统计操作, 如getMax,getMin,getSum,getAverage
- mapToInt
- flatMap
- filter
- distinct
- sorted
- peek 对每个元素执行操作并返回一个新的 Stream
- limit
- skip
- parallel
- sequential
- unordered
- map (mapToInt, flatMap 等)
-
Terminal
一个流只能有一个 terminal 操作, 当这个操作执行后, 流就被使用 光 了, 无法再被操作.
所以这必定是流的最后一个操作.
Terminal 操作的执行, 才会真正开始流的遍历, 并且会生成一个结果, 或者一个 side effect.-
forEach 接收一个 Lambda 表达式, 然后在 Stream 的每一个元素上执行该表达式.
-
forEachOrdered
-
toArray
-
reduce
-
collect
-
min
-
max
-
count
-
anyMatch
-
allMatch
-
noneMatch
-
findFirst
-
findAny
-
iterator
-
-
short-circuiting
-
对于一个 intermediate 操作, 如果它接受的是一个无限大(infinite/unbounded)的 Stream, 但返回一个有限的新 Stream.
-
对于一个 terminal 操作, 如果它接受的是一个无限大的 Stream, 但能在有限的时间计算出结果.
-
anyMatch
-
allMatch
-
noneMatch
-
findFirst
-
findAny
-
limit
-
3. 自己生成流
1 | Random seed = new Random(); |
1 | Stream.iterate(0, n -> n + 3).limit(10). forEach(x -> System.out.print(x + " ")); |
实现了很多归约操作,如 Collectors.toList(), Collectors.joining(", ")