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_CUP与C++中的YACC(Yet Another Compiler-Compiler)类似,都是用于生成解析器的工具,但Java_CUP是专为Java设计的,因此它更加适应Java的编程环境和语言特性。同时,Java_CUP的输出代码可以直接在Java应用程序...
此外,还可能涉及反射、泛型、枚举、注解等Java特性。反射允许在运行时检查类的信息,创建和调用对象;泛型提供类型安全,避免强制类型转换;枚举可以创建固定数量的常量;注解则是一种元数据,可以用来提供编译时或...
Java Platform, Enterprise Edition 8 SDK Update 1 Java EE 8 continues to improve API and programming models needed for today's applications and adds features requested by our world-wide community. ...
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_util_concurrent_user_guide.zipjava_util_concurrent_user_guide.zipjava_util_concurrent_user_guide.zipjava_util_concurrent_user_guide.zipjava_util_concurrent_user_guide.zipjava_util_concurrent_user...
java相关项目开发短信功能使用的jar包
8. **可执行文件(exe)**:在C++中,编译后的代码可以生成可执行文件,但在Java中,程序通常被编译为字节码并由JVM执行。这意味着转换后的Java代码需要通过Java虚拟机运行。 总的来说,“CPlus_to_Java_Converter...
- **Java EE 8兼容**:作为Java EE 8规范的参考实现,GlassFish 5支持Java EE 8的所有新特性和API,如JSF 2.3、JPA 2.2、EJB 3.2等。 - **性能提升**:对服务器性能进行了优化,包括更快的应用部署和更高效的内存...
JAVA_1.8版API参考手册_中文版,本人精心收藏的东西, 希望对大家有帮助。 对于英文不是很好的同学,帮助很大,不过还是建议一边学习一边学英文把,毕竟开发文档大多数是英文,等汉化版估计也几年时间过去了,那也...
java控制串口发送数据时在windows环境下正常,linux环境下报错C [librxtxSerial.so+0x75da] Java_gnu_io_RXTXPort_nativeDrain+0xea,经多方查询验证为rxtx包版本问题,用本文档中的版本可以正常运行
`JAVA_ClassLib.rar_classlib ja_java 类库_java核心_java类库手册` 这个压缩包文件包含了一份详细的 Java 类库指南,旨在帮助学习者深入理解和运用Java的核心功能。 首先,我们要明白Java类库的重要性。类库是预...
这个"Java8 API.rar"压缩包包含了Java 8的官方API文档,对于学习和使用Java 8的新特性,以及查阅相关类和方法的详细信息,是非常重要的参考资料。 Java 8 API的核心亮点之一是Lambda表达式。这是一种简洁的函数式...
该文件用于解决通过java控制串口发送数据给时在Linux环境下报错,但在windows环境下正常。报错内容如下: [librxtxSerial.so+0x75da] Java_gnu_io_RXTXPort_nativeDrain+0xea。经过一番研究得出结论为为rxtx包版本...
《JAVA_API_1.8_中文手册》是一个针对Java 1.8版本的API参考文档,它是Java开发者不可或缺的学习和工作资源。这份手册以其全面、准确的中文翻译,为中文使用者提供了极大的便利,使得理解复杂的Java API变得更为简单...
General_NetSDKDemo_Chn_Java_Linux64_IS_V1.00.41295.T.190925.7z 这里的包是Linux64最全的,大华技术说其他的linux动态库都是有问题的 分三个包 大华设备各种Demo及所需jar包 \libs\linux64 examples.jar ...
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向...
"JAVA_sample_150.rar_JavaPOS_Sample.zi_java samp_java sample"这个标题暗示了我们正在处理一个包含150个Java编程示例的压缩文件,这些示例可能覆盖了Java的基础和进阶特性,旨在帮助初学者更好地理解和掌握Java...
6. **文档和指南**:详细的用户指南和开发者手册,解释了如何安装、配置和使用Java Card开发工具包,以及如何进行应用程序的生命周期管理。 7. **库文件**:一些必要的库文件,比如JAR文件,包含Java Card运行时...
java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的...