比较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. Ubuntu16.04.3深度学习环境搭建

    依赖 pip3 install pillow 安装numpy相关sudo apt-get install python-numpy python-scipy python-matplotlib ipy ...

  2. gSOAP 使用

    1. wsdl2h 生成服务定义头文件 wsdl2h -o calc.h http://www.genivia.com/calc.wsdl 2. 从服务定义头文件calc.h生成客户端代码 soapc ...

  3. tensorflow学习笔记(二十五):ConfigProto&GPU

    tensorflow ConfigPrototf.ConfigProto一般用在创建session的时候.用来对session进行参数配置 with tf.Session(config = tf.Co ...

  4. redisUtil

    package com.cinc.ecmp.utils; import org.springframework.beans.factory.annotation.Autowired; import o ...

  5. vue-learning:26 - component - 组件三大API之一:prop

    组件三大API之一: prop prop的大小写 prop接收类型 字符串数组形式 对象形式: type / required / default / validator prop传递类型: 静态传递 ...

  6. vue 插件大全

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

  7. Oracle如何分组排序并产生序号

    SELECT C.ORG_SHORTNAME, B.USER_NAME, ROW_NUMBER () OVER ( PARTITION BY B.ORG_ID ORDER BY A.TOTAL_SCO ...

  8. mysql find_in_set 与 in 的用法与区别,mysql范围搜索,mysql范围查询

    mysql find_in_set 与 in 的用法与区别 1.find_in_set 用于模糊查询,并且数据库中的值是用英文逗号分隔的: 例如: (1).去字段中查询 select find_in_ ...

  9. DQN 强化学习

    pytorch比tenserflow简单. 所以我们模仿用tensorflow写的强化学习. 学习资料: 本节的全部代码 Tensorflow 的 100行 DQN 代码 我制作的 DQN 动画简介 ...

  10. 序列化表单数据$("form").serializeArray()

    在做一个后台管理系统类似的项目中发现不能直接取得表单中的数值,于是想到先将表单数据转化为json,然后再用js从json中获取数据,那不就简单了吗? 于是我用了jquery的serializeArra ...