使用for循环与stream流对List类型转换效率对比

背景

今天接到一个需求,需要在之前同事写的代码基础上改动一下来完成。找到需要改动的地方写完了之后,准备自测,发现执行速度实在太慢了,才仔细看了下代码,循环里面套循环,再到最内层的循环里面一条一条的发sql去查询,算了实在看不下,改,结果就改的一发不可收拾,时间就花的有点多,后面这些基础的都改的差不多的时候,又来消灭循环,能不用循环的地方就尽量不用,然后就遇到了题目所示的问题。

代码不方便透露,就自己写了个测试代码,先讲一下大致问题,基本跟如下代码差不多

    List<Object> newList = new ArrayList<>();
        for (Object i : oldList) {
            Object o = new Object();
            BeanUtils.copyProperties(i, o);
            newList.add(o);
        }

行动

当时看到这段代码的第一想法,就是为嘛不用stream流呢?可当我想到这里的时候,又在想,在这个需求里面难道stream流就真的比for循环快吗?于是就想着自己写点测试代码来试一下哪种方式更快一些,那需要的测试代码如下:

for循环代码:
    private static Long forLoopMethod(List<Object> oldList){
        long begin = System.currentTimeMillis();
        List<Object> newList = new ArrayList<>();
        for (Object i : oldList) {
            Object o = new Object();
            BeanUtils.copyProperties(i, o);
            newList.add(o);
        }
        return System.currentTimeMillis() - begin;
    }
stream流方式的代码如下:
    private static Long streamMethod(List<Object> oldList){
        long begin = System.currentTimeMillis();
        List<Object> collect = oldList.stream().map(i -> {
            Object o = new Object();
            BeanUtils.copyProperties(i, o);
            return o;
        }).collect(Collectors.toList());
        return System.currentTimeMillis() - begin;
    }
测试方法:
    public static void main(String[] args) {
        List<Object> oldList = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            oldList.add(i);
        }
        System.out.println("forLoopMethod花费时间:" + forLoopMethod(oldList));
        System.out.println("streamMethod花费时间:" + streamMethod(oldList));
    }

测试环境:

电脑8core16thread

jdk:1.8

测试结果:
次数\方法名forLoopMethodstreamMethod
第1次1327
第2次1186
第3次1266
第4次1155
第5次1146
第6次1215
第7次1246
第8次1265
第9次1185
第10次1146

使用for循环平均花费时间: 120.8

使用stream流平均花费时间:5.7

结论

结论已经很清楚,在当前需求前提下,stream流比for循环速度要快得多,赶紧把项目里面给改了,爽歪歪!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第1章 什么是Java程序设计语言 1 1.1 Java语言诞生背景 1 1.2 Java语言的特点 1 1.2.1 可移植性(universality) 1 1.2.2 安全性(security) 1 1.2.3 Java Virtual Machine(JVM) 2 1.2.4 面向对象的程序设计语言 2 1.2.5 线程(thread) 2 1.2.6 垃圾回收机制(garbage collection) 2 1.3 安装Java程序开发工具(JDK1.5) 2 1.3.1 安装JAVA 2 Standard Edition 1.5.0 3 1.3.2 安装开发文档及最终完成 5 1.3.3 Java开发工具 6 1.4 Java程序开发过程 7 1.5 运行第一个Java程序 7 1.6 巩固练习 8 第2章 理解对象与类 9 2.1 什么是对象 9 2.2 什么是类 9 2.3 HelloJava示例的分析 11 2.4 巩固练习 12 第3章 Java语言的基本语法 13 3.1 代码编写规则 13 3.2 注释 13 3.3 标识符 14 3.4 变量和常量 15 3.5 数据类型 16 3.5.1 基本数据类型 16 3.5.2 对象类型 21 3.6 类型转换 21 3.6.1 自动类型转换 22 3.6.2 强制类型转换 24 3.6.3 String型对象与基本数据类型间的运算 25 3.7 运算符 25 3.7.1 逻辑非(!) 26 3.7.2 位非运算符(~) 26 3.7.3 符号运算符(+、-) 27 3.7.4 增减运算符(++、--) 27 3.7.5 算术运算符(+、-、*、/) 29 3.7.6 位移(shift)运算符(、、) 29 3.7.7 关系运算符(、、=、=、==、!=) 31 3.7.8 快速逻辑与(&&)和快速逻辑或(||) 32 3.7.9 位运算符:位与(&)、位或(|)、位异或(^) 34 3.7.10 三目运算符(?:) 35 3.7.11 赋值运算符 36 3.7.12 对象运算符(instanceof) 37 3.8 巩固练习 37 第4章 程序流程控制语句 39 4.1 if语句 39 4.1.1 if语句格式1 39 4.1.2 if语句格式2 40 4.1.3 if语句格式3 41 4.2 switch语句 44 4.3 for语句 46 4.3.1 break语句 49 4.3.2 continue语句 49 4.3.3 多重for循环语句 50 4.3.4 多重for循环语句中的break与continue 52 4.4 while语句 55 4.5 do-while语句 57 4.6 巩固练习 57 第5章 类与对象 59 5.1 类的定义与对象的创建 59 5.2 引用赋值 61 5.3 成员方法 62 5.3.1 void返回类型 64 5.3.2 无参方法 65 5.3.3 多参方法 65 5.4 局部变量和成员变量 67 5.5 this引用 68 5.6 静态变量与静态方法 70 5.7 成员与静态方法的关系 71 5.8 包与导入 72 5.9 访问控制符 74 5.10 重载 77 5.11 构造函数 79 5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固练习 85 第6章 数组 86 6.1 基本数据类型数组 86 6.2 一维数组的初始化 88 6.3 对象数组 88 6.4 二维数组 91 6.5 三维数组 95 6.6 巩固练习 97 第7章 对象与方法 99 7.1 对象的创建与销毁 99 7.2 值传递调用 102 7.3 引用传递调用 103 7.4 获取命令行参数 105 7.5 返回对象引用 106 7.6 返回新对象 107 7.7 自引用 108 7.8 递归调用 111 7.9 巩固练习 114 第8章 继承 117 8.1 继承的概念 117 8.2 子类对象的创建 118 8.3 this与super 119 8.4 继承中的访问控制符 123 8.5 覆盖 124 8.6 多态 126 8.7 引用的范围 127 8.8 引用变量的类型转换 128 8.9 Object类 129 8.10 “==”与equals() 130 8.11 Object型引用变量 132 8.12 类的层级图 134 8.13 巩固练习 135 第9章 抽象类与接口 136 9.1 抽象类 136 9.2 final关键字 138 9.3 接口 139 9.4 Cloneable 接口 143 9.5 Enumeration接口 144 9.6 巩固练习 145

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值