Java8 Streams流
流(Stream)是Java 8中引入的一个新的抽象层。使用流,您可以以类似于SQL语句的声明方式处理数据。例如,考虑以下SQL语句。
上述的SQL表达式会自动返回最高薪水的雇员详细信息,而无需在开发者端进行任何计算。使用Java的集合框架,开发者需要使用循环并进行重复检查。另一个问题是效率;由于多核处理器很容易获取,Java开发者需要编写并行处理代码,这可能容易出错。
为了解决这些问题,Java 8引入了流(Stream)的概念,它可以让开发者以声明式的方式处理数据并充分利用多核架构,而无需为此编写任何特定的代码。
什么是流(Stream)
流(Stream)表示从源中获取的对象的序列,可以支持聚合操作。以下是流(Stream)的特点:
- 元素序列 − 流(Stream)以顺序方式提供特定类型的一组元素。流(Stream)按需获取/计算元素,它不会存储元素。
-
源 − 流(Stream)的输入源可以是集合(Collections)、数组(Arrays)或I/O资源。
-
聚合操作 − 流(Stream)支持过滤(filter)、映射(map)、限制(limit)、归约(reduce)、查找(find)、匹配(match)等聚合操作。
-
流水线处理 − 大多数流(Stream)操作返回流(Stream)本身,以便其结果可以连续处理。这些操作被称为中间操作,它们的作用是接受输入,处理它们,并将输出返回给目标。collect()方法是一个终端操作,通常位于流(Stream)流水线操作的末尾,表示流的结束。
-
自动迭代 − 流(Stream)操作在内部迭代提供的源元素上进行迭代,与集合(Collections)不同,不需要显式迭代。
生成流(Stream)
在Java 8中,Collection接口有两个方法可以生成流(Stream)。
- stream() − 返回将集合作为其源的顺序流(Stream)。
-
parallelStream() − 返回将集合作为其源的并行流(Stream)。
forEach
Stream提供了一个新的方法‘forEach’,用于迭代流的每个元素。以下代码段展示了如何使用forEach打印10个随机数。
map
‘map’方法用于将每个元素映射到其对应的结果。以下代码段使用map打印出数字的唯一平方数。
过滤器
“filter”方法用于根据条件消除元素。下面的代码段使用filter打印空字符串的数量。
限制
‘limit’方法用于减小流的大小。下面的代码段展示了如何使用limit方法打印出10个随机数。
按顺序排列
‘sorted’方法用于对流进行排序。下面的代码片段展示了如何以排序的方式打印出10个随机数。
并行处理
parallelStream是流的替代品,用于并行处理。看下面的代码片段,使用parallelStream打印空字符串的数量。
在顺序流和并行流之间切换非常容易。
收集器
收集器被用于将流中元素的处理结果组合起来。收集器可以用于返回一个列表或一个字符串。
统计数据
在Java 8中,引入了统计数据收集器,用于在流处理时计算所有统计数据。
流示例
使用您选择的任何编辑器,在C:> JAVA中创建以下Java程序。
Java8Tester.java
验证结果
使用 javac 编译器编译类,如下所示 –
现在按照以下步骤运行Java8Tester:
它应该产生以下结果−