“核心技术Ⅱ:流”的版本间差异
跳到导航
跳到搜索
无编辑摘要 |
|||
第2行: | 第2行: | ||
== 关于 Java SE 8 的流库 == | == 关于 Java SE 8 的流库 == | ||
<pre> | |||
Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操作,例如查找、过滤、分组、排序等一系列的操作。 | |||
并且有串行、并行两种执行模式,并行模式充分的利用了多核处理器的优势,使用fork/join框架进行了任务拆分,同时提高了执行速度。 | |||
简而言之,Stream就是提供了一种高效且易于使用的处理数据的方式。 | |||
</pre> | |||
流提供了一种在比集合更高的概念级别上指定计算的数据视图,以“做什么而非怎么做”的方式处理集合。 | |||
=== 从迭代到流的操作 === | === 从迭代到流的操作 === | ||
处理集合时,通常会迭代遍历它的元素,并在每个元素上执行某项操作: | |||
<syntaxhighlight lang="java"> | |||
String contents = new String(Files.readAllBytes(Paths.get("alice.txt")), Standard(harsets,UTF_8); // Read file into string | |||
List<String> words= Arrays.aslist(contents.split("\\PL+")); // Split into words; nonletters are delimiters | |||
long count = O; | |||
for (String w : words) | |||
{ | |||
if (w. length() > 12) | |||
count++; | |||
} | |||
</syntaxhighlight> | |||
使用流时,相同的操作看起来像下面这样: | |||
<syntaxhighlight lang="java"> | |||
1ong count = words. stream().filter(w -> w.length() > 12).count(); | |||
</syntaxhighlight> | |||
* 仅将s tream 修改为parallel Stream 就可以让流库以并行方式来执行过滤和计数: | |||
<syntaxhighlight lang="java"> | |||
1ong count = words.parallelStream().filter(w -> w.length() > 12).count(); | |||
</syntaxhighlight> | |||
=== 流与集合 === | |||
流表面上活起来和集合很类似,都可以让我们转换和获取数据。但是,它们之间存在着显著的差异: | |||
# 流并不存储其元素。 | |||
#: 这些元素可能存储在底层的栠合中,或者是按需生成的。 | |||
# 流的操作不会修改其数据源。 | |||
#: 例如,filter 方法不会从新的流中移除元素,而是会生成一个新的流,其中不包含被过滤掉的元素。 | |||
# 流的操作是尽可能惰性执行的。这意味若直至需要其结果时,操作才会执行。 | |||
#: 例如,如果我们只想查找前5 个长单词而不是所有长单词,那么filter 方法就会在匹配到第5 个单词后停止过滤。因此,我们甚至可以操作无限流。 | |||
=== 相关方法 === | |||
java.util.stream.Stream<T> 8 | |||
* Stream<T> filter(Predicate<? super T> p) | |||
*: 产生一个流,其中包含当前流中满足P 的所有元索。 | |||
* 1ong count() | |||
*: 产生当前流中元素的数批。这是一个终止操作。 | |||
java.util.Collection<E> 1.2 | |||
* default Stream<E> stream() | |||
* default Stream<E> parallel Stream() | |||
*: 产生当前集合中所有元素的顺序流或并行流。 | |||
== 流的创建 == | == 流的创建 == |
2020年11月21日 (六) 20:46的版本
关于 Java SE 8 的流库
Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操作,例如查找、过滤、分组、排序等一系列的操作。 并且有串行、并行两种执行模式,并行模式充分的利用了多核处理器的优势,使用fork/join框架进行了任务拆分,同时提高了执行速度。 简而言之,Stream就是提供了一种高效且易于使用的处理数据的方式。
流提供了一种在比集合更高的概念级别上指定计算的数据视图,以“做什么而非怎么做”的方式处理集合。
从迭代到流的操作
处理集合时,通常会迭代遍历它的元素,并在每个元素上执行某项操作:
String contents = new String(Files.readAllBytes(Paths.get("alice.txt")), Standard(harsets,UTF_8); // Read file into string
List<String> words= Arrays.aslist(contents.split("\\PL+")); // Split into words; nonletters are delimiters
long count = O;
for (String w : words)
{
if (w. length() > 12)
count++;
}
使用流时,相同的操作看起来像下面这样:
1ong count = words. stream().filter(w -> w.length() > 12).count();
- 仅将s tream 修改为parallel Stream 就可以让流库以并行方式来执行过滤和计数:
1ong count = words.parallelStream().filter(w -> w.length() > 12).count();
流与集合
流表面上活起来和集合很类似,都可以让我们转换和获取数据。但是,它们之间存在着显著的差异:
- 流并不存储其元素。
- 这些元素可能存储在底层的栠合中,或者是按需生成的。
- 流的操作不会修改其数据源。
- 例如,filter 方法不会从新的流中移除元素,而是会生成一个新的流,其中不包含被过滤掉的元素。
- 流的操作是尽可能惰性执行的。这意味若直至需要其结果时,操作才会执行。
- 例如,如果我们只想查找前5 个长单词而不是所有长单词,那么filter 方法就会在匹配到第5 个单词后停止过滤。因此,我们甚至可以操作无限流。
相关方法
java.util.stream.Stream<T> 8
- Stream<T> filter(Predicate<? super T> p)
- 产生一个流,其中包含当前流中满足P 的所有元索。
- 1ong count()
- 产生当前流中元素的数批。这是一个终止操作。
java.util.Collection<E> 1.2
- default Stream<E> stream()
- default Stream<E> parallel Stream()
- 产生当前集合中所有元素的顺序流或并行流。