`

跟我一起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.)。这个暂时还没验证过,只是备注在这里。
分享到:
评论

相关推荐

    java使用stream对日期排序

    在Java编程中,Stream API是Java 8引入的一个强大特性,它允许我们以声明性方式处理数据集合。本文将深入探讨如何使用Stream API对日期进行排序。日期排序在数据分析、日志处理、报表生成等场景中非常常见。下面我们...

    java JDK 1.8-8u202/ 16.0.1

    2. **方法引用来替代匿名内部类**:与lambda表达式一起,Java 8允许使用方法引用,可以直接引用已有方法,减少代码冗余。 3. **流(Stream)**:流API允许对集合进行函数式编程操作,如过滤、映射和聚合,大大简化了...

    jdk8安装包: jdk-8u202-windows-x64

    首先,JDK 8是Oracle公司发布的Java平台标准版(Java SE)的一个重要版本,于2014年3月发布。它引入了许多新特性,旨在提高开发效率和程序性能。其中最显著的变化包括: 1. **lambda表达式**:这是JDK 8最重要的...

    JAVA电子教案------入门级java学习资料

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而闻名。这份“JAVA电子教案------入门级java学习资料”是为初学者精心准备的学习资源,旨在帮助那些刚开始接触Java的人快速理解其基本概念...

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    java 8下载,版本 8u351, solaris各版本

    - Java 8是Java平台标准版(Java SE)的第8个主要版本,于2014年3月18日正式发布。 - 版本号8u351是Java 8的一个更新,"u"代表"update",意味着这是对原始发布的一系列修复和增强。 2. **新特性**: - **Lambda...

    Java编程1-20例 Java编程1-20例

    18. **Stream API**:与Lambda表达式一起引入的Stream API提供了新的数据处理方式,适用于集合和I/O操作,使代码更加简洁、高效。 19. **模块化系统(Java 9+)**:Java 9引入了模块化系统,有助于大型项目的组织和...

    Based-on-the-Java-mp3-player.zip_player

    Java Sound API可以通过`AudioSystem.getAudioInputStream()`方法从文件或流中获取`AudioInputStream`对象。这一步涉及到音频文件的解码,因为Java Sound API不直接支持MP3格式,所以我们需要一个MP3解码器库,如...

    684.682.JAVA基础教程_动态代理与Java8新特性-Stream的终止操作:收集(684).rar

    在本教程中,我们将深入探讨Java编程中的两个关键概念:动态代理和Java 8的新特性,特别是关于Stream API的终止操作——收集。首先,我们来理解动态代理。 动态代理是Java提供的一种机制,允许在运行时创建代理类,...

    Java-programming-source.rar_java programming

    总之,这份“Java-programming-source.rar”资源包是学习Java编程的理想起点,通过系统学习和实践,你可以建立起坚实的Java基础,为进一步深入学习Java高级特性,如Java 8的Lambda表达式、Stream API,或是Java框架...

    java-lesson-plans.rar_java课程设计

    15. **Java 8及以后的新特性**:例如Lambda表达式、Stream API、Optional类、日期时间API等,都是Java 8引入的重要更新,对于提升代码简洁性和可读性有显著效果。 这个"java-lesson-plans"压缩包很可能包含了以上...

    jdk-8u121-windows-x64.exe

    这个版本的JDK是Java 8更新121(Update 121),它包含了Java运行时环境(JRE)、Java编译器(javac)、Java文档生成器(javadoc)、Java调试器(jdb)以及其他必要的工具。 1. **Java环境的重要性** - 在使用...

    683.681.JAVA基础教程_动态代理与Java8新特性-Stream的终止操作:归约(683).rar

    在Java编程语言中,动态代理和Java 8的新特性,特别是Stream API的使用,是现代开发中的重要概念。本教程将深入探讨这两个主题,并重点讲解Stream API中的终止操作——归约(Reduction)。 首先,让我们了解动态...

    Java-sound-player-source-code.rar_player

    2. **AudioInputStream类**:这是Java处理音频数据的基本流类。它从音频输入流中读取音频数据,并可以与音频格式转换器一起使用,以支持不同格式的音频文件。 3. **Clip接口**:实现了Line接口,主要用于循环播放...

    Java8中文文档

    3. **默认方法**:在接口中,Java 8引入了默认方法(default methods),它们有实现的接口方法,可以在不破坏旧代码的情况下增加新功能。这使得接口能够添加新行为,而无需强制已实现该接口的类进行修改。 4. **...

    初学者的------Java记事本------初作

    在实际应用中,开发者可能使用了Java的流(Stream) API来处理文件读写,或者是利用BufferedReader和PrintWriter等类进行文本操作。 【压缩包子文件的文件名称列表】:practice_03 "practice_03"这个名字可能代表这...

    jdk-8u321-windows-x64.exe

    标题中的"jdk-8u321-windows-x64.exe"指的是Java Development Kit(JDK)的第8个版本的更新321,专为64位Windows操作系统设计的安装程序。这个文件是Oracle公司提供的,用于在Windows系统上安装Java开发环境。JDK...

    Java Stream 全面讲解

    Java Stream API是Java 8引入的一个重要特性,它改变了我们处理集合的方式。除了Stream之外,Java还提供了丰富的I/O操作,如InputStream和OutputStream等,这些也是处理文件或网络数据的重要方式。 #### 二、Java ...

    jdk8-jdk-8u121-linux-x64.tar.gz

    **Java Development Kit (JDK) 8 是一个关键的编程工具包,用于开发和运行Java应用程序。这个压缩包 "jdk8-jdk-8u121-linux-x64.tar.gz" 包含了适用于Linux 64位系统的JDK 8更新121版本。** JDK是Java SE(Standard...

    jdk-8u121-windows-x64_8.0.1210.13.zip

    2. **函数接口**:Java 8引入了`FunctionalInterface`注解,标识那些只有一个抽象方法的接口,如`Runnable`和`Comparator`,它们可以与Lambda表达式一起使用。 3. **Stream API**:Stream API提供了一种声明式的...

Global site tag (gtag.js) - Google Analytics