`

跟我一起java8(3)----Stream

阅读更多
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 stream的分组功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    java8中Stream的使用以及分割list案例

    主要介绍了java8中Stream的使用以及分割list案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    java8 stream自定义分组求和并排序的实现

    主要介绍了java8 stream自定义分组求和并排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java8stream源码-neo4j-event-console-content-pack:Graylog内容包展示了与图形数据库集成的高级

    java8流源码Neo4j 演示内容包 Graylog 内容包演示了与 Neo4j 图形数据库集成的高级日志管理用例。 此内容包最适合与 Graylog 2.0 和更新版本中的新随机消息生成器一起使用。 时间段关系 关键关系 依赖关系 具有日志...

    java jdk-api-1.6 中文 chmd

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    Java 8系列之Stream中万能的reduce用法说明

    主要介绍了Java 8系列之Stream中万能的reduce用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Java8中Stream使用的一个注意事项

    java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中Stream使用过程中的一个注意事项,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

    JAVA8 stream中三个参数的reduce方法对List进行分组统计操作

    主要介绍了JAVA8 stream中三个参数的reduce方法对List进行分组统计操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Java8 stream 中利用 groupingBy 进行多字段分组求和案例

    主要介绍了Java8 stream 中利用 groupingBy 进行多字段分组求和案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Java8处理集合的优雅姿势之Stream

    主要给大家介绍了关于Java8优雅处理集合之Stream的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    java8 streamList转换使用详解

    主要介绍了java8 streamList转换使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    javaapi和源码-docker-mysql-java:将mysql与Java示例代码一起使用的示例源:“mysql-json-java”和

    java-stream-api-like-sql” 要求 Docker或Docker Toolbox 用法 下载并解压缩该程序包,然后移至根目录。 启动Docker或Docker Toolbox并执行以下命令以构建服务。 docker-compose build 完成后,执行以下命令以启动...

    java8 stream 由一个list转化成另一个list案例

    主要介绍了java8 stream 由一个list转化成另一个list案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    JAVA_API1.6文档(中文)

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    spring-cloud-stream-rabbit

    春云流兔Spring Cloud Stream示例展示了各种消息交换模式。 该项目基于Baeldung构建的SCS示例,并进行了修改以与Elmhurst版本或更高版本一起使用。 示例包括: MessageConverter:样本处理器应用程序,它接收一条...

    Java8 Stream对两个 List 遍历匹配数据的优化处理操作

    主要介绍了Java8 Stream对两个 List 遍历匹配数据的优化处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Java8中利用stream对map集合进行过滤的方法

    主要给大家介绍了关于Java8中利用stream对map集合进行过滤的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java8新特性之stream的collect实战教程

    主要介绍了java8新特性之stream的collect实战教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Java8如何构建一个Stream示例详解

    Java 8 是迄今为止在语义上改动上最大的一个平台。下面这篇文章主要给大家介绍了关于Java8如何构建一个Stream的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

    java8stream源码-hello-world:我测试存储库

    java8流源码你好,世界 Me test repository AO test No. 1! :) Ceri #我需要的一组技术:领域驱动设计? 设计模式 使用 CXF 监控 JVM JAX-WS 工作的方法(服务器)(wssecurity!)(使用 jaxb 对象创建客户端) JAX...

Global site tag (gtag.js) - Google Analytics