比较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. 2018-8-10-WPF-使用-VisualStudio-2017-项目文件

    title author date CreateTime categories WPF 使用 VisualStudio 2017 项目文件 lindexi 2018-08-10 19:16:53 +0 ...

  2. JavaScript 拖曳和居中问题

    今天遇到了一个问题,是这样的,有一个div盒子,实现盒子居中,居中的样式是这样的见下 #box{ width:300px; height:150px; position:absolute; left: ...

  3. jq常用动画fade slide

    https://www.cnblogs.com/sandraryan/ hide(); <div class="box">big box</div> $(' ...

  4. php 使用正则匹配中文 返回结果

    $str = 'eg5455正则匹配中文123三国杀'; $patten='/[\x{4e00}-\x{9fa5}]+/u'; $a = preg_match($patten, $str, $mn); ...

  5. H3C NAPT

  6. linux主编号的动态分配

    一些主设备编号是静态分派给最普通的设备的. 一个这些设备的列表在内核源码树的 Documentation/devices.txt 中. 分配给你的新驱动使用一个已经分配的静态编号的机会 很小, 但是, ...

  7. Jenkins 配置自动合并 release 分支到 master 分支

    本文告诉大家如何在 Jenkins 配置合并到 release 的内容自动合并到 gitlab 的 master 分支 首先需要两个仓库,一个是 gitlab 的仓库,另一个是 Jenkins 的仓库 ...

  8. linux获知当前时间

    内核代码能一直获取一个当前时间的表示, 通过查看 jifies 的值. 常常地, 这个值只代 表从最后一次启动以来的时间, 这个事实对驱动来说无关, 因为它的生命周期受限于系统 的 uptime. 如 ...

  9. 1119 机器人走方格 V2 (组合数学)

    M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果.   Input 第1行,2个数M,N,中间用空格隔开 ...

  10. codeforces 1217E E. Sum Queries? (线段树

    codeforces 1217E E. Sum Queries? (线段树 传送门:https://codeforces.com/contest/1217/problem/E 题意: n个数,m次询问 ...