最近进公司 学习jdk8性特性,今天对常用的遍历for foreach stream ,parallelStream循环做一个比较:先直接上代码吧:
package cn.com.wangzha.xiaoman.base;
import java.util.ArrayList;
import java.util.List;
import static java.lang.System.err;
import static java.lang.System.out;
/**
* @author zhangkun
* @create 2018-12-15 10:34 AM
* @desc
**/
public class TetsClass3 {
public static void main(String[] args) {
List<String> sourceList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
sourceList.add("第" + i + "条数据");
}
out.println("数据条数:" + sourceList.size());
long a1 = System.currentTimeMillis();
for (int i = 0; i < sourceList.size(); i++) doSome();
long a2 = System.currentTimeMillis();
out.println("普通for循环用时:" + (a2 - a1));
long b1 = System.currentTimeMillis();
for (String t : sourceList) doSome();
long b2 = System.currentTimeMillis();
out.println("增强for循环用时:" + (b2 - b1));
long c1 = System.currentTimeMillis();
sourceList.forEach((t) -> doSome());
long c2 = System.currentTimeMillis();
out.println("forEach循环用时:" + (c2 - c1));
// System.err.println("串行话打印");
long d1 = System.currentTimeMillis();
sourceList.stream().forEach((t)->doSome());//串行话处理
long d2 = System.currentTimeMillis();
out.println("forEach-Stream循环用时:" + (d2 - d1));
long e1 = System.currentTimeMillis();
// System.err.println("并行话打印");
sourceList.parallelStream().forEach((t)->doSome());// 并行化处理
long e2 = System.currentTimeMillis();
out.println("forEach-parallelStream循环用时:" + (e2 - e1));
long f1 = System.currentTimeMillis();
sourceList.parallelStream().forEachOrdered((t)->doSome());//
long f2 = System.currentTimeMillis();
System.out.println("forEachOrdered-parallelStream循环用时:"+(f2-f1));
sourceList.stream().forEach(err::println);
System.err.println("分界线-----------");
sourceList.parallelStream().forEach(j-> out.println(j));//并行化处理
System.err.println("分界线2-----------");
sourceList.parallelStream().forEachOrdered(out::println);
}
private static void doSome(){
try {
Thread.sleep(1); //一毫秒
//out.println(Thread.currentThread());
}catch (Exception e){
e.printStackTrace();
}
}
}
结果:
数据条数:5
普通for循环用时:8
增强for循环用时:6
forEach循环用时:92
forEach-Stream循环用时:10
forEach-parallelStream循环用时:9
第0条数据
第1条数据
第2条数据
第3条数据
第4条数据
分界线-----------
分界线2-----------
forEachOrdered-parallelStream循环用时:9
第1条数据
第0条数据
第2条数据
第3条数据
第4条数据
第0条数据
第1条数据
第2条数据
第3条数据
第4条数据
从上面我们可以看出结果 在数据量少的情况下 增加for 循环>普通for 这个不是重点 数据量大了之后 增加for<普通循环。不过项目中一般for循环不会太大。所以这点效率上不算什么。
forEach-parallelStream for循环>forEach-Stream循环 任何时候。从名称就可以看出来parallelStream是进行并行出来,将一个列表分成多个快,进行并行运行。Stream 是进行串行运行和传统的Iterable 一样。进行封装 效率上可能还没有普通的 for循环高,只是在写法上回更加的简单便捷。Stream 输出时候是有序性集合 parallelStream输出时候是无序集合 如果也想有序可以使用
forEachOrdered-parallelStream 整体上效率也比 stream高一点。不过如果代码循环量中不是太大,印象不会太大,如果专注于并发编程可以多使用这种 从两者的源码也可以比较的出:
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);//stream :false ,parallelStream: true
}
也可以打印一下当前线程就了解了:
结果:
串行话打印
Thread[main,5,main]
forEach循环用时:107
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
Thread[main,5,main]
并行话打印
Thread[main,5,main]
分界线-----------
分界线2-----------
Thread[ForkJoinPool.commonPool-worker-2,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
Thread[ForkJoinPool.commonPool-worker-3,5,main]
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-3,5,main]
Thread[ForkJoinPool.commonPool-worker-2,5,main]
当然这里只做了比较 parallelStream效率, 作为并发编程的流处理重要的类当然 要了解一下他的底层结构:
它通过默认的ForkJoinPool 实现并发 可以参考一下下面文章:
parallelStream 与 ForkJoinPool关系:
https://blog.csdn.net/Darrensty/article/details/79283146
Java 8 中的 Streams API 详解:
https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/
分享到:
相关推荐
Java JDK 8是Java开发历史上一个重要的里程碑,它引入了许多创新特性和改进,极大地提升了开发效率和代码的可读性。其中,Stream API和Lambda表达式是两大核心新特性,它们为处理集合数据提供了全新的方式。 **...
在JDK8的Stream API中,还可以进行并行处理(parallelStream),这为大数据集的操作提供了性能提升的可能,尤其是在多核CPU上。 为了更好地理解和使用这些操作,需要对它们的使用方式和它们如何组合起来完成复杂的...
JDK 1.8,也被称为Java SE 8,是Java平台的一个重要版本更新,其引入了多项新的特性和改进,极大地提升了Java编程的效率和表达能力。这些新特性包括函数式接口、接口的默认方法和静态方法、方法引用、Lambda表达式、...
Lambda表达式是JDK8最显著的新特性之一,它为Java引入了函数式编程的概念。Lambda允许我们将匿名函数作为参数传递,或者直接定义为变量。这种简洁的语法使得处理集合和事件变得更加便捷。例如: ```java List...
以下是一些JDK8的主要新特性及其相关代码解释: 1. **Lambda表达式**: Lambda表达式是JDK8最重要的新特性之一,它允许函数作为方法参数,简化了匿名内部类的使用。Lambda表达式的语法简洁明了,形式为`...
### JDK 8 新特性详解 #### 1. 前言 随着技术的不断发展与进步,JDK 1.8 的推出带来了许多重要的更新与改进,不仅极大地提升了开发效率,也使得 Java 语言更加现代化。Spring 5 和 Spring Boot 2.0 都推荐使用 JDK...
1. **Lambda表达式**:这是JDK8最重要的新特性,引入了函数式编程的概念。Lambda表达式允许将匿名函数作为方法参数,简化了处理集合、事件监听器等场景的代码,提高了代码的可读性和效率。 2. **方法引用和构造器...
1.8 新特性 1. 速度更快 – 红黑树 2. 代码更少 – Lambda 3. 强大的Stream API – Stream 4. 便于并行 – Parallel 5. 最大化减少空指针异常 – Optional
Java Development Kit (JDK) 8是Java编程语言的一个重要版本,它引入了许多新特性、改进和优化。这个"jdk8官方文档"包含了详细的开发者指南、API参考、教程和其他资源,帮助开发者理解和利用JDK 8的功能。以下是文档...
1. **Lambda表达式**:这是JDK 8最重要的特性之一,它引入了一种新的语法结构,允许开发者以更简洁的方式处理函数式接口。Lambda表达式使代码更易读,更易于维护,特别是在处理集合和并行流时。 2. **方法引用**:...
**JDK8详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用...下载这个压缩包后,可以通过`jdk-8u171-windows-x64.exe`执行文件来安装JDK8,然后就可以在Windows环境下享受这些新特性带来的便利。
**Java Development Kit (JDK) 8 中文手册** ...通过深入学习JDK 8中文手册,开发者可以充分利用这些新特性,提升代码质量和开发效率。手册详细阐述了每个API的功能、用法以及示例,是Java 8开发者的必备参考资料。
JDK8引入了许多重要的新特性,其中最显著的是Lambda表达式,它简化了处理函数式编程和集合的操作。Stream API也是JDK8的一大亮点,它允许对集合进行高效、声明式的操作,提高了代码的可读性和简洁性。此外,新版本还...
9. **Parallel Collectors**:在`Collectors`类中,JDK8提供了并行流的收集器,如`parallelStream()`,可以充分利用多核处理器的性能进行并行计算。 10. **类型注解**:JDK8扩展了注解的使用范围,允许在类型声明...
Stream API是JDK8的一大亮点,它提供了用于操作集合的新方式,支持串行和并行流,可以进行高效的数据处理和聚合操作,如map、filter、reduce等。 **5. Date和Time API重构** JDK8对日期和时间API进行了重大改进,...
8. ** Nashorn JavaScript引擎**:JDK 8引入了一个JavaScript引擎,允许Java代码直接调用JavaScript代码,反之亦然,促进了Java与JavaScript之间的交互。 9. **接口的私有方法和静态方法**:接口现在可以拥有私有...
JDK 8是Oracle公司发布的一个重要版本,它的出现引入了许多新特性,大大提升了Java开发者的工作效率。在这个免费分享的JDK 8压缩包文件中,你可以找到所有必要的组件来搭建和运行Java应用程序。 首先,JDK 8的核心...
10. **新的并发改进**:Java 8在`ForkJoinPool`和`Parallel Streams`方面做了优化,使得并行计算更加高效。此外,`ConcurrentHashMap`的性能也有所提升。 以上这些特性都是Java 8的重要更新,通过深入学习和熟练...
通过深入学习和掌握JDK 8 API文档中的这些特性,开发者能够更好地利用Java 8的新功能,提高代码的效率和可维护性。无论是在日常开发还是面试准备中,JDK 8 API文档都是一个不可或缺的参考资料。
9. **新的 Nashorn JavaScript引擎**:JDK 8包含了Nashorn JavaScript引擎,允许Java代码直接执行JavaScript,促进了Java与JavaScript之间的交互。 10. **改进的编译器和JVM**:JDK 8的编译器(Javac)和虚拟机...