比较for循环、迭代器、java8Stream流遍历的不同

 package cnom.test.testUtils;

 import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Random; public class TestCollectionsSort { public static void main(String[] args) throws InterruptedException {
TestCollectionsSort test = new TestCollectionsSort(); List<TestSortModel> list = new ArrayList<TestSortModel>();
TestSortModel model = null;
for (int i = 0; i < 80000; i++) {
model = test.new TestSortModel();
int intId = (int) (Math.random() * 100);
model.setIntId(intId);
model.setName("tes" + i);
list.add(model);
}
// JAVA8 使用Comparator排序
// list.sort(Comparator.comparing(TestSortModel::getIntId,
// Comparator.nullsLast(Comparator.naturalOrder()))); List<String> resList = new ArrayList<String>(); long t1 = System.currentTimeMillis();
for (TestSortModel tsm : list) {
int id = tsm.getIntId();
// Thread.sleep(1);
resList.add(tsm.getName());
}
System.out.println("增强for循环 遍历耗时:" + (System.currentTimeMillis() - t1) + ";list.size()="
+ list.size() + ";list=" + resList.toString());
resList.clear(); long t2 = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
int id = list.get(i).getIntId();
// Thread.sleep(1);
resList.add(list.get(i).getName());
}
System.out.println("for循环 遍历耗时:" + (System.currentTimeMillis() - t2) + ";list.size()="
+ list.size() + ";list=" + resList.toString());
resList.clear(); long t3 = System.currentTimeMillis();
Iterator<TestSortModel> it = list.iterator();
TestSortModel tm = null;
while (it.hasNext()) {
tm = it.next();
int id = tm.getIntId();
// Thread.sleep(1);
resList.add(tm.getName());
}
System.out.println("iterator 遍历耗时:" + (System.currentTimeMillis() - t3) + ";list.size()="
+ list.size() + ";list=" + resList.toString());
resList.clear(); //parallerlStream遍历,适用于处理比较耗时的业务逻辑。
//注意:若在遍历中将元素添加到另一个list,则这个list必须是线程安全的,否则遍历过程中会出现两种情况:
//1.这个list中的元素会有丢失的情况; 2.遍历中会抛出:ArrayIndexOutOfBoundsException
List<TestSortModel> listt = Collections.synchronizedList(new ArrayList<TestSortModel>());
long t4 = System.currentTimeMillis();
list.parallelStream().forEach(tsm -> {//若是 forEachOrdered会保持原来list顺序
int id = tsm.getIntId();
// listt.add(tsm);//输出的listt会有元素丢失,线程安全的list则不会
try {
// Thread.sleep(1);
resList.add(tsm.getName());//输出的resList也会有元素丢失
} catch (Exception e) {
e.printStackTrace();
}
});
System.out
.println("list.parallelStream().forEach() 遍历耗时:" + (System.currentTimeMillis() - t4)
+ ";list.size()=" + resList.size() + ";list=" + resList.toString());
resList.clear(); long t5 = System.currentTimeMillis();
list.stream().forEach(tsm -> {//串行执行,与for循环效率相似,代码精简
int id = tsm.getIntId();
try {
// Thread.sleep(1);
resList.add(tsm.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
System.out.println("list.stream().forEach() 遍历耗时:" + (System.currentTimeMillis() - t5)
+ ";list.size()=" + list.size() + ";list=" + resList.toString());
resList.clear(); long t6 = System.currentTimeMillis();
list.forEach(tsm -> {//精简代码,与for循环效率相似
int id = tsm.getIntId();
try {
// Thread.sleep(1);
resList.add(tsm.getName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
System.out.println("list.forEach() 遍历耗时:" + (System.currentTimeMillis() - t6)
+ ";list.size()=" + list.size() + ";list=" + resList.toString());
resList.clear(); /**
* for loop1 增强for循环 遍历耗时:80051
* for loop2 for循环 遍历耗时:80032
* iterator 遍历耗时:80069
* list.parallelStream().forEach() 遍历耗时:20101 多线程环境下,执行耗时的业务逻辑时使用效率更好。
* list.stream().forEach() 遍历耗时:80049 精简代码
* list.forEach() 遍历耗时:80031
*/ } public class TestSortModel implements Serializable { private static final long serialVersionUID = -890909910704287938L; private long longId; private int intId; private String name; public long getLongId() {
return longId;
} public void setLongId(long longId) {
this.longId = longId;
} public int getIntId() {
return intId;
} public void setIntId(int intId) {
this.intId = intId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
}

java8中的stream流遍历的更多相关文章

  1. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  2. Java8中的Stream流式操作 - 入门篇

    作者:汤圆 个人博客:javalover.cc 前言 之前总是朋友朋友的叫,感觉有套近乎的嫌疑,所以后面还是给大家改个称呼吧 因为大家是来看东西的,所以暂且叫做官人吧(灵感来自于民间流传的四大名著之一 ...

  3. 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?

    写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...

  4. java中的Stream流

    java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 ...

  5. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  6. 理解nodejs中的stream(流)

    阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...

  7. java8 新特性Stream流的应用

    作为一个合格的程序员,如何让代码更简洁明了,提升编码速度尼. 今天跟着我一起来学习下java 8  stream 流的应用吧. 废话不多说,直入正题. 考虑以下业务场景,有四个人员信息,我们需要根据性 ...

  8. Java8中的Stream API

    本篇文章继续介绍Java 8的另一个新特性——Stream API.新增的Stream API与InputStream和OutputStream是完全不同的概念,Stream API是对Java中集合 ...

  9. Java8新特性 Stream流式思想(一)

    遍历及过滤集合中的元素使用传统方式遍历及过滤集合中的元素package cn.com.zq.demo01.Stream.test01.Stream; import java.util.ArrayLis ...

随机推荐

  1. html前端登录验证

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 利用 jquery 获取某个元素下的所有图片并改变其属性

    HTML代码 <div id="mochu"> <p>内容....<./p> <p><img src="xxxx.p ...

  3. while循环计算1-100和,1-100内偶数/奇数/被整除的数的和

    文章地址 https://www.cnblogs.com/sandraryan/ <!DOCTYPE html> <html lang="en"> < ...

  4. 深入java面向对象一:==和equals详解

    本文从多篇博客笔记融合而来,系转载,非原创,参考: 1.  http://www.cnblogs.com/e241138/archive/2012/09/16/2687981.html 2.  htt ...

  5. tensorflow学习笔记(四十五):sess.run(tf.global_variables_initializer()) 做了什么?

    当我们训练自己的神经网络的时候,无一例外的就是都会加上一句 sess.run(tf.global_variables_initializer()) ,这行代码的官方解释是 初始化模型的参数.那么,它到 ...

  6. css 百分比继承关系的探讨

    引入:近日在回顾css基础的时候发现了一个有趣的问题,就是css在继承百分比类属性的时候是继承百分比后再根据父级宽高计算,还是继承父级根据百分比计算过后的绝对值.下面举一个简单的例子来描述这一个问题, ...

  7. python 使用PyInstaller遇到的坑

    给个链接 https://github.com/yinghualuowu/Python_VLPR/releases 参数问题 在网上随处可以见到PyInstaller的参数教程. -F : 打包成单个 ...

  8. 用nodejs创建服务器显示html页面

    nodejs版本:v10.14.2 1.首先准备一个简单的html页面 <!DOCTYPE html> <html lang="en"> <head& ...

  9. C# 从零开始写 SharpDx 应用 绘制基础图形

    本文告诉大家通过 SharpDx 画出简单的 2D 界面 本文属于 SharpDx 系列 博客,建议从头开始读 本文分为两步,第一步是初始化,第二步才是画界面 初始化 先创建 RenderForm 用 ...

  10. CentOS服务器安装mysql

    1.配置YUM源 下载mysql源安装包 [root@localhost~]#wget http://dev.mysql.com/get/mysql57-community-release-el7-8 ...