Stream是java8引入的概念,表示"支持序列和平行聚合操作的一系列元素"(A sequence of elements supporting sequential and parallel aggregate operations)。它是一个接口,定义了一系列方法定义和默认实现(注意:java8里的接口已经支持静态方法和default了)。先看一个实例:
class Widget {
String color;
int weight;
public Widget(String color, int weight){
this.color = color;
this.weight = weight;
}
}
public void testInit() {
List<Widget> widgets = Arrays.asList(new Widget("RED", 12),
new Widget("YELLO", 3),
new Widget("BLUE", 7));
int sum = widgets.stream()
.filter(w -> "RED".equalsIgnoreCase(w.color))
.mapToInt(w -> w.weight)
.sum();
System.out.println(sum);
}
这段代码里,widgets.stream()返回一个序列化的Stream对象,接着filter()接受一个Predicate类型的对象,用来过滤符合要求的元素,然后mapToInt()将Widget元素组装成一个IntStream,此例中是返回它的weight属性,最后sum()求和。
还有一个parallel stream("平行流"?不知道怎么翻译好)的概念,它采用java7引入的Fork/Join框架,将问题分而治之,最后将结果汇总。看下面的例子:
@Test
public void testSort() throws IOException {
List<Double> doubleList = new ArrayList<Double>();
BufferedReader reader = new BufferedReader(new FileReader("doubles.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
doubleList.add(Double.parseDouble(line));
}
reader.close();
System.out.println("AvailableProcessors: "
+ Runtime.getRuntime().availableProcessors());
int LOOP = 5;
for (int i = 0; i < LOOP; i++) {
long start = System.currentTimeMillis();
doubleList.stream()
.parallel()
.mapToDouble(d -> longTimeComputation(d))
.sum();
long end = System.currentTimeMillis();
System.out.println("Parallel Take : " + (end - start));
}
for (int i = 0; i < LOOP; i++) {
long start = System.currentTimeMillis();
doubleList.stream()
.mapToDouble(d -> longTimeComputation(d))
.sum();
long end = System.currentTimeMillis();
System.out.println("Take : " + (end - start));
}
}
doubles.txt是一千万个double类型随机数,测试结果如下:
AvailableProcessors: 2
Parallel Take : 7124
Parallel Take : 6710
Parallel Take : 6383
Parallel Take : 6215
Parallel Take : 6771
Take : 12172
Take : 12039
Take : 12195
Take : 12557
Take : 12121
在两个处理器的环境下,很明显parallel stream的速度比sequential stream快,耗时差不多后者一半。但是,这也并非在所有情况下使用parallel stream都是最优的方法,根据"Think twice before using Java 8 parallel streams(
http://java.dzone.com/articles/think-twice-using-java-8)"一文所讲,parallel stream并行处理任务,如果其中一个耗时很长的情况下,会出现意料不到的情况,有些时候正常的任务都完成了,有些时候一些任务卡在了这个慢任务后面(Sometimes all healthy tasks finish, sometimes few of them are stuck behind the slow one.)。这个暂时还没验证过,只是备注在这里。
分享到:
相关推荐
主要给大家介绍了关于java8 stream的分组功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了java8中Stream的使用以及分割list案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要介绍了java8 stream自定义分组求和并排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java8流源码Neo4j 演示内容包 Graylog 内容包演示了与 Neo4j 图形数据库集成的高级日志管理用例。 此内容包最适合与 Graylog 2.0 和更新版本中的新随机消息生成器一起使用。 时间段关系 关键关系 依赖关系 具有日志...
java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....
主要介绍了Java 8系列之Stream中万能的reduce用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中Stream使用过程中的一个注意事项,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
主要介绍了JAVA8 stream中三个参数的reduce方法对List进行分组统计操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要介绍了Java8 stream 中利用 groupingBy 进行多字段分组求和案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要给大家介绍了关于Java8优雅处理集合之Stream的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了java8 streamList转换使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java-stream-api-like-sql” 要求 Docker或Docker Toolbox 用法 下载并解压缩该程序包,然后移至根目录。 启动Docker或Docker Toolbox并执行以下命令以构建服务。 docker-compose build 完成后,执行以下命令以启动...
主要介绍了java8 stream 由一个list转化成另一个list案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....
春云流兔Spring Cloud Stream示例展示了各种消息交换模式。 该项目基于Baeldung构建的SCS示例,并进行了修改以与Elmhurst版本或更高版本一起使用。 示例包括: MessageConverter:样本处理器应用程序,它接收一条...
主要介绍了Java8 Stream对两个 List 遍历匹配数据的优化处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要给大家介绍了关于Java8中利用stream对map集合进行过滤的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了java8新特性之stream的collect实战教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Java 8 是迄今为止在语义上改动上最大的一个平台。下面这篇文章主要给大家介绍了关于Java8如何构建一个Stream的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
java8流源码你好,世界 Me test repository AO test No. 1! :) Ceri #我需要的一组技术:领域驱动设计? 设计模式 使用 CXF 监控 JVM JAX-WS 工作的方法(服务器)(wssecurity!)(使用 jaxb 对象创建客户端) JAX...