4.2 Stream
新增加的Stream API (java.util.stream)引入了在Java里可以工作的函数式编程。这是目前为止对java库最大的一次功能添加,希望程序员通过编写有效、整洁和简明的代码,能够大大提高生产率。
Stream API让集合处理简化了很多(我们后面会看到不仅限于Java集合类)。让我们从一个简单的类Task开始来看看Stream的用法。
01
public class Streams {
02
private enum Status {
03
OPEN, CLOSED
04
};
05
06
private static final class Task {
07
private final Status status;
08
private final Integer points;
09
10
Task( final Status status, final Integer points ) {
11
this.status = status;
12
this.points = points;
13
}
14
15
public Integer getPoints() {
16
return points;
17
}
18
19
public Status getStatus() {
20
return status;
21
}
22
23
@Override
24
public String toString() {
25
return String.format( "[%s, %d]", status, points );
26
}
27
}
28
}
Task类有一个分数的概念(或者说是伪复杂度),其次是还有一个值可以为OPEN或CLOSED的状态.让我们引入一个Task的小集合作为演示例子:
1
final Collection< Task > tasks = Arrays.asList(
2
new Task( Status.OPEN, 5 ),
3
new Task( Status.OPEN, 13 ),
4
new Task( Status.CLOSED, 8 )
5
);
第一个问题是所有的开放的Task的点数是多少?在java 8 之前,通常的做法是用foreach迭代。但是Java8里头我们会用Stream。Stream是多个元素的序列,支持串行和并行操作。
1
// Calculate total points of all active tasks using sum()
2
final long totalPointsOfOpenTasks = tasks
3
.stream()
4
.filter( task -> task.getStatus() == Status.OPEN )
5
.mapToInt( Task::getPoints )
6
.sum();
7
8
System.out.println( "Total points: " + totalPointsOfOpenTasks );
控制台的输出将会是:
Total points: 18
上面代码执行的流程是这样的,首先Task集合会被转化为Stream表示,然后filter操作会过滤掉所有关闭的Task,接下来使用Task::getPoints 方法取得每个Task实例的点数,mapToInt方法会把Task Stream转换成Integer Stream,最后使用Sum方法将所有的点数加起来得到最终的结果。
在我们看下一个例子之前,我们要记住一些关于Stream的说明。Stream操作被分为中间操作和终点操作。
中间操作返回一个新的Stream。这些中间操作是延迟的,执行一个中间操作比如filter实际上不会真的做过滤操作,而是创建一个新的Stream,当这个新的Stream被遍历的时候,它里头会包含有原来Stream里符合过滤条件的元素。
终点操作比如说forEach或者sum会遍历Stream从而产生最终结果或附带结果。终点操作执行完之后,Stream管道就被消费完了,不再可用。在几乎所有的情况下,终点操作都是即时完成对数据的遍历操作。
Stream的另外一个价值是Stream创造性地支持并行处理。让我们看看下面这个例子,这个例子把所有task的点数加起来。
1
// Calculate total points of all tasks
2
final double totalPoints = tasks
3
.stream()
4
.parallel()
5
.map( task -> task.getPoints() ) // or map( Task::getPoints )
6
.reduce( 0, Integer::sum );
7
8
System.out.println( "Total points (all tasks): " + totalPoints );
这个例子跟上面那个非常像,除了这个例子里使用了parallel()方法 并且计算最终结果的时候使用了reduce方法。
输出如下:
Total points (all tasks): 26.0
经常会有这个一个需求:我们需要按照某种准则来对集合中的元素进行分组。Stream也可以处理这样的需求,下面是一个例子:
1
// Group tasks by their status
2
final Map< Status, List< Task > > map = tasks
3
.stream()
4
.collect( Collectors.groupingBy( Task::getStatus ) );
5
System.out.println( map );
控制台的输出如下:
阅读全文
http://click.aliyun.com/m/21831/
分享到:
相关推荐
Java 环境配置与设置 JAVA_HOME, CLASSPATH, PATH 的目的 Java 环境配置是 Java 开发的基础,我们需要正确地配置 JAVA_HOME, CLASSPATH, PATH 等环境变量,以便正确地编译和运行 Java 程序。在本节中,我们将详细地...
Java EE SDK 8u1-web.zip 是一个包含Java企业版(Java Enterprise Edition,简称Java EE)开发工具的压缩包,特别地,它包含了Java Development Kit(JDK)的一个版本。JDK是Java程序开发的核心组件,提供了编译、...
压缩包中的`JAVA_API_1.8_CHS.CHM`和`JAVA_API_1.8_CHS.chw`是Java 8 API的中文文档,对于开发者来说是学习和查阅Java类库的重要参考资料。它们提供了关于Java SE 8的所有类、接口、方法和异常的详细信息,帮助...
JAVA_1.8版API参考手册_中文版,本人精心收藏的东西, 希望对大家有帮助。 对于英文不是很好的同学,帮助很大,不过还是建议一边学习一边学英文把,毕竟开发文档大多数是英文,等汉化版估计也几年时间过去了,那也...
Java API还包括了高级特性的支持,如网络编程的java.net包,多线程的java.concurrent包,以及数据库访问的java.sql包。java.net包提供了Socket、ServerSocket等类,用于实现网络通信。java.concurrent包包含线程池、...
`JAVA_ClassLib.rar_classlib ja_java 类库_java核心_java类库手册` 这个压缩包文件包含了一份详细的 Java 类库指南,旨在帮助学习者深入理解和运用Java的核心功能。 首先,我们要明白Java类库的重要性。类库是预...
java手册中英文java8,java9手册 Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 Java编程语言的风格十分接近C++语言。继承了C++语言...
《6.openPlant JAVA 二次开发手册》是针对OpenPlant软件的JAVA API进行深入解析的一份技术文档,由openplant、openPlantjava、happyu91等领域的专家共同编撰,旨在帮助开发者更好地理解和利用JAVA语言进行OpenPlant...
General_NetSDKDemo_Chn_Java_Linux64_IS_V1.00.41295.T.190925.7z 这里的包是Linux64最全的,大华技术说其他的linux动态库都是有问题的 分三个包 大华设备各种Demo及所需jar包 \libs\linux64 examples.jar ...
《JAVA_API_1.8_中文手册》是一个针对Java 1.8版本的API参考文档,它是Java开发者不可或缺的学习和工作资源。这份手册以其全面、准确的中文翻译,为中文使用者提供了极大的便利,使得理解复杂的Java API变得更为简单...
Java_SE_类库查询手册
6. **文档和指南**:详细的用户指南和开发者手册,解释了如何安装、配置和使用Java Card开发工具包,以及如何进行应用程序的生命周期管理。 7. **库文件**:一些必要的库文件,比如JAR文件,包含Java Card运行时...
标题中的"java_record_codes.rar_SWT_java record_java swt_java 屏幕录像"指的是一个使用Java SWT库开发的屏幕录像程序的源代码压缩包。这个程序允许开发者或用户记录计算机的屏幕活动,可能是为了创建教程、演示...
阿里巴巴Java开发手册(终极版).pdf
sun_java_wireless_toolkit-2_5_2-windows.exe
java_tm_8.0.660.18
本手册为JDK-API-1.8版本,java中文版api手册。JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具...
Java_EE软件工程师就业求职手册.docJava_EE软件工程师就业求职手册.docJava_EE软件工程师就业求职手册.doc
【描述】中的"结合java8高级技术这本书写的一个小的日志管理系统",说明了这个项目是基于Java 8的高级特性构建的,如Lambda表达式、Stream API、Optional类、并发处理等。日志管理系统通常用于收集、存储和分析应用...
java_api_zh_cn_20060302.chm 中文版