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

  1. package cnom.test.testUtils;
  2.  
  3. import java.io.Serializable;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.Comparator;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import java.util.Random;
  10.  
  11. public class TestCollectionsSort {
  12.  
  13. public static void main(String[] args) throws InterruptedException {
  14. TestCollectionsSort test = new TestCollectionsSort();
  15.  
  16. List<TestSortModel> list = new ArrayList<TestSortModel>();
  17. TestSortModel model = null;
  18. for (int i = 0; i < 80000; i++) {
  19. model = test.new TestSortModel();
  20. int intId = (int) (Math.random() * 100);
  21. model.setIntId(intId);
  22. model.setName("tes" + i);
  23. list.add(model);
  24. }
  25. // JAVA8 使用Comparator排序
  26. // list.sort(Comparator.comparing(TestSortModel::getIntId,
  27. // Comparator.nullsLast(Comparator.naturalOrder())));
  28.  
  29. List<String> resList = new ArrayList<String>();
  30.  
  31. long t1 = System.currentTimeMillis();
  32. for (TestSortModel tsm : list) {
  33. int id = tsm.getIntId();
  34. // Thread.sleep(1);
  35. resList.add(tsm.getName());
  36. }
  37. System.out.println("增强for循环 遍历耗时:" + (System.currentTimeMillis() - t1) + ";list.size()="
  38. + list.size() + ";list=" + resList.toString());
  39. resList.clear();
  40.  
  41. long t2 = System.currentTimeMillis();
  42. for (int i = 0; i < list.size(); i++) {
  43. int id = list.get(i).getIntId();
  44. // Thread.sleep(1);
  45. resList.add(list.get(i).getName());
  46. }
  47. System.out.println("for循环 遍历耗时:" + (System.currentTimeMillis() - t2) + ";list.size()="
  48. + list.size() + ";list=" + resList.toString());
  49. resList.clear();
  50.  
  51. long t3 = System.currentTimeMillis();
  52. Iterator<TestSortModel> it = list.iterator();
  53. TestSortModel tm = null;
  54. while (it.hasNext()) {
  55. tm = it.next();
  56. int id = tm.getIntId();
  57. // Thread.sleep(1);
  58. resList.add(tm.getName());
  59. }
  60. System.out.println("iterator 遍历耗时:" + (System.currentTimeMillis() - t3) + ";list.size()="
  61. + list.size() + ";list=" + resList.toString());
  62. resList.clear();
  63.  
  64. //parallerlStream遍历,适用于处理比较耗时的业务逻辑。
  65. //注意:若在遍历中将元素添加到另一个list,则这个list必须是线程安全的,否则遍历过程中会出现两种情况:
  66. //1.这个list中的元素会有丢失的情况; 2.遍历中会抛出:ArrayIndexOutOfBoundsException
  67. List<TestSortModel> listt = Collections.synchronizedList(new ArrayList<TestSortModel>());
  68. long t4 = System.currentTimeMillis();
  69. list.parallelStream().forEach(tsm -> {//若是 forEachOrdered会保持原来list顺序
  70. int id = tsm.getIntId();
  71. // listt.add(tsm);//输出的listt会有元素丢失,线程安全的list则不会
  72. try {
  73. // Thread.sleep(1);
  74. resList.add(tsm.getName());//输出的resList也会有元素丢失
  75. } catch (Exception e) {
  76. e.printStackTrace();
  77. }
  78. });
  79. System.out
  80. .println("list.parallelStream().forEach() 遍历耗时:" + (System.currentTimeMillis() - t4)
  81. + ";list.size()=" + resList.size() + ";list=" + resList.toString());
  82. resList.clear();
  83.  
  84. long t5 = System.currentTimeMillis();
  85. list.stream().forEach(tsm -> {//串行执行,与for循环效率相似,代码精简
  86. int id = tsm.getIntId();
  87. try {
  88. // Thread.sleep(1);
  89. resList.add(tsm.getName());
  90. } catch (Exception e) {
  91. // TODO Auto-generated catch block
  92. e.printStackTrace();
  93. }
  94. });
  95. System.out.println("list.stream().forEach() 遍历耗时:" + (System.currentTimeMillis() - t5)
  96. + ";list.size()=" + list.size() + ";list=" + resList.toString());
  97. resList.clear();
  98.  
  99. long t6 = System.currentTimeMillis();
  100. list.forEach(tsm -> {//精简代码,与for循环效率相似
  101. int id = tsm.getIntId();
  102. try {
  103. // Thread.sleep(1);
  104. resList.add(tsm.getName());
  105. } catch (Exception e) {
  106. // TODO Auto-generated catch block
  107. e.printStackTrace();
  108. }
  109. });
  110. System.out.println("list.forEach() 遍历耗时:" + (System.currentTimeMillis() - t6)
  111. + ";list.size()=" + list.size() + ";list=" + resList.toString());
  112. resList.clear();
  113.  
  114. /**
  115. * for loop1 增强for循环 遍历耗时:80051
  116. * for loop2 for循环 遍历耗时:80032
  117. * iterator 遍历耗时:80069
  118. * list.parallelStream().forEach() 遍历耗时:20101 多线程环境下,执行耗时的业务逻辑时使用效率更好。
  119. * list.stream().forEach() 遍历耗时:80049 精简代码
  120. * list.forEach() 遍历耗时:80031
  121. */
  122.  
  123. }
  124.  
  125. public class TestSortModel implements Serializable {
  126.  
  127. private static final long serialVersionUID = -890909910704287938L;
  128.  
  129. private long longId;
  130.  
  131. private int intId;
  132.  
  133. private String name;
  134.  
  135. public long getLongId() {
  136. return longId;
  137. }
  138.  
  139. public void setLongId(long longId) {
  140. this.longId = longId;
  141. }
  142.  
  143. public int getIntId() {
  144. return intId;
  145. }
  146.  
  147. public void setIntId(int intId) {
  148. this.intId = intId;
  149. }
  150.  
  151. public String getName() {
  152. return name;
  153. }
  154.  
  155. public void setName(String name) {
  156. this.name = name;
  157. }
  158.  
  159. }
  160. }

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. Android Studio(十一):代码混淆及打包apk

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  2. Layout布局(补充)

    HBoxLayout和VBoxLayout HBoxLayout和VBoxLayout布局都比较简单,也叫箱式布局,它按照先后顺序进行横向布局或垂直布局.另外这两种布局也提供了pack属性支持,设置内 ...

  3. hdu 5734 Acperience(2016多校第二场)

    Acperience Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. js切割字符串

    var time_str= '2019-9-10 13:18:20'; var t = time_str.substr(2,8);   console.log(t);   输出  19-9-10

  5. HDU1686 Oulipo 题解 KMP算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意:给你一个子串t和一个母串s,求s中有多少个子串t. 题目分析:KMP模板题. cal_ ...

  6. uva 100 The 3n + 1 problem (RMQ)

    uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem= ...

  7. 原生js用div实现简单的轮播图

    文章地址 https://www.cnblogs.com/sandraryan/ 原生js实现轮播图. 打开页面图片自动轮播,点击prev next按钮切换到上/下一张图片,点击1-5切换到对应图片. ...

  8. Python--day29--logging模块(日志模块)

    重要程度六颗星,比如一个小窗口的广告如果因为你没有日志的问题导致点击量没有记录下来,几十分钟那就会损失几十万了,这责任谁负得起. 希望离开一个公司是因为有了更好的去处而不是因为各种各样的原因被开掉,那 ...

  9. [WC2013]平面图——平面图点定位

    [WC2013]平面图 码农题 平面图点定位: 1.平面图转对偶图:[HNOI2016]矿区 2.扫描线点定位 把所有的顶点和询问点排序,扫描线 每个边在fr的位置加入,to的位置删除,竖直直线不要 ...

  10. Codeforces Round #200 (Div. 1 + Div. 2)

    A. Magnets 模拟. B. Simple Molecules 设12.13.23边的条数,列出三个等式,解即可. C. Rational Resistance 题目每次扩展的电阻之一是1Ω的, ...