一、遍历 -- 最好和stream流连用

使用jdk8提供的forEach进行遍历时,采用的是多线程的操作,理论上讲是会比原来的方法更快。但是注意,系统启动时需要加载lambda框架的内容。因此如果通过main函数这种直接测试新老方法更快,很有可能因为新方法需要加载lambda,导致性能反而不如老方法。但是,对于启动着的项目,就可以避免由于初次加载lambda导致的问题。

1、 list遍历

List对象.forEach((item)->{

循环体要进行的操作;

});

注:item就是每一个list元素

public void forEachInList() {
    List<Teacher> list
= new ArrayList<>();
    for (int i = 1; i < 1000000; i++) {
        Student student = new Student("学生编号" + i, "学生姓名" + i);
        Teacher teacher = new Teacher("老师姓名" + i, student);
        list.add(teacher);
    }
    long start2
= System.currentTimeMillis();
    for (Teacher teacher : list) {
        String teacherName
= teacher.getTeacherName();
        Student student = teacher.getStudent();
        String stuId
= student.getStuId();
        String stuName
= student.getStuName();
        for (int i = 0; i < 10000; i++) {

}
    }
    long end2
= System.currentTimeMillis();
    System.out.println("老方法遍历list:" + (end2 - start2) + "ms");
    long start1
= System.currentTimeMillis();
    list.forEach((item) -> {
        String teacherName
= item.getTeacherName();
        Student student = item.getStudent();
        String stuId
= student.getStuId();
        String stuName
= student.getStuName();
        for (int i = 0; i < 10000; i++) {

}
    });
    long end1
= System.currentTimeMillis();
    System.out.println("新方法遍历list:" + (end1 - start1) + "ms");
}

2、 Map遍历

Map对象.forEach((key,value)->{

循环体内需要进行的操作;

});

注:key就是每一个map元素的键,value就是每一个map元素的值;key与value是成对的。

public void forEachInMap() {
    Map<Integer, Teacher> map = new HashMap<>();
    for (int i = 1; i < 1000000; i++) {
        Student student = new Student("学生编号" + i, "学生姓名" + i);
        Teacher teacher = new Teacher("老师姓名" + i, student);
        map.put(i, teacher);
    }
    long start2 = System.currentTimeMillis();
    for (Map.Entry<Integer, Teacher> entry : map.entrySet()) {
        Teacher teacher = entry.getValue();
        String teacherName = teacher.getTeacherName();
        Student student = teacher.getStudent();
        String stuId = student.getStuId();
        String stuName = student.getStuName();
        for (int i = 0; i < 10000; i++) {         }
    }
    long end2 = System.currentTimeMillis();
    System.out.println("老方法遍历map:" + (end2 - start2) + "ms");
    long start1 = System.currentTimeMillis();
    map.forEach((key, value) -> {
        String teacherName = value.getTeacherName();
        Student student = value.getStudent();
        String stuId = student.getStuId();
        String stuName = student.getStuName();
        for (int i = 0; i < 10000; i++) {         }
    });
    long end1 = System.currentTimeMillis();
    System.out.println("新方法遍历map:" + (end1 - start1) + "ms");
}

3、 数组遍历

Collections.addAll(list对象,数组);

List对象. .forEach((item)->{

循环体要进行的操作;

});

注:item就是每一个list元素;由于数组没有提供forEach方法,因此需要先转换成list,通过list进行遍历操作。

此外,可以通过Arrays.stream()或者Stream.of()的方式先将数组转换成stream流,进而使用stream流的forEach方法。

public void forEachInArray() {
    Teacher[] teachers = new Teacher[1000000];
    for (int i = 0; i < 1000000; i++) {
        Student student = new Student("学生编号" + i, "学生姓名" + i);
        Teacher teacher = new Teacher("老师姓名" + i, student);
        teachers[i] = teacher;
    }
    long start2 = System.currentTimeMillis();
    for (Teacher teacher : teachers) {
        String teacherName = teacher.getTeacherName();
        Student student = teacher.getStudent();
        String stuId = student.getStuId();
        String stuName = student.getStuName();
        for (int i = 0; i < 10000; i++) {         }
    }
    long end2 = System.currentTimeMillis();
    System.out.println("老方法遍历数组:" + (end2 - start2) + "ms");
    long start1 = System.currentTimeMillis();
    List<Teacher> teacherList = new ArrayList<>();
    Collections.addAll(teacherList, teachers);
    teacherList.forEach((value) -> {
        String teacherName = value.getTeacherName();
        Student student = value.getStudent();
        String stuId = student.getStuId();
        String stuName = student.getStuName();
        for (int i = 0; i < 10000; i++) {         }
    });
    long end1 = System.currentTimeMillis();
    System.out.println("新方法遍历数组:" + (end1 - start1) + "ms");
}

(一)jdk8学习心得之遍历的更多相关文章

  1. (六)jdk8学习心得之Stream流

    六.Stream流 1. 什么是stream流 现阶段,可以把stream流看成一个高级版的Iterator.普通的Iterator只能实现遍历,遍历做什么,就需要具体些功能代码函数了.而这个stre ...

  2. (八)jdk8学习心得之Optional类

    八.Optional 类 1. 作用:可以存放空指针null,主要用于解决空指针问题. 2. 使用方法 1) 创建对象(2种方法) Optional optional = Optional.of(非n ...

  3. (七)jdk8学习心得之join方法

    七.join方法 1. 作用:将list或者数组按照连接符进行连接,返回一个字符串. 2. 使用方法 1) String.join(“连接符”,数组对象或者list对象) 2) 首先转换成stream ...

  4. (五)jdk8学习心得之默认方法

    五.默认方法 1. 使用方法:写在接口中,就是为了接口可以做一些事情. 2. 目的:有很多实现类,有一个公共的抽象方法,其实这些实现类实现该抽象方法的内容是完全一致的,完全没有必要都重新实现一遍.并且 ...

  5. (四)jdk8学习心得之函数式接口

    四.函数式接口 1. 格式 注:抽象方法就是通过lambda表达式或者方法引用实现. 2. Jdk提供的函数式接口(这里提供五个最为常用的) 3. 技巧 通过函数式接口,就可以把一个函数作为一个参数进 ...

  6. (三)jdk8学习心得之方法引用

    三.方法引用 https://www.jianshu.com/p/c9790ba76cee 这边博客写的很好,可以首先阅读,在这里感谢这篇文章的博主. 1. 格式 调用者::调用者具备的方法名 2. ...

  7. (二)jdk8学习心得之Lambda表达式

    二.Lambda表达式 1. 格式 (参数1,参数2,…,参数n)->{方法体} 注意: (参数1,参数2,...,参数n)要与方法接口中的参数一致,但是名字可以不一样. 此外,方法类型接口,有 ...

  8. JavaScript 秘密花园 学习心得

    目的 记录一下学习心得,便于以后复习,内容是比较基础的...但是很多内容我还是不知道... 对象 对象使用和属性 1.JavaScript 中所有变量都可以当作对象使用,除了两个例外 null和dun ...

  9. effective java 学习心得

    目的 记录一下最主要学习心得,不然凭我这种辣鸡记忆力分分钟就忘记白看了... 用静态工厂方法代替构造器的最主要好处 1.不必每次都创建新的对象 Boolean.valueOf Long.valueOf ...

随机推荐

  1. 【Python3爬虫】百度一下,坑死你?

    一.写在前面 这个标题是借用的路人甲大佬的一篇文章的标题(百度一下,坑死你),而且这次的爬虫也是看了这篇文章后才写出来的,感兴趣的可以先看下这篇文章. 前段时间有篇文章<搜索引擎百度已死> ...

  2. Tomcat 对 HTTP 协议的实现(上)

    协议,直白的说就是存在一堆字节,按照协议指定的规则解析就能得出这堆字节的意义.HTTP 解析分为两个部分:解析请求头和请求体. 请求头解析的难点在于它没有固定长度的头部,也不像其他协议那样提供数据包长 ...

  3. 基本 SQL 之增删改查(一)

    上篇文章,我们介绍了数据的基本 DDL 语句,你应当具备基本的创建数据库.数据表的 SQL 语句,以及表字段的基本数据类型的熟知. 那么本篇就来总结总结大家日常最频繁接触到的 DDM 语句,也就是基本 ...

  4. Lumen框架—升级改造之路-开篇

    一.前言    首先,我先阐述下,为什么要做这件事.lumen是一款比较轻型的PHP框架,但是,作为项目开发来说,它还是缺少很多东西,比如Response返回值规范的自定义,异常抛出格式的自定义,以及 ...

  5. [转]Date and String Function in BluePrism

    本文转自:https://www.codeproject.com/Articles/1247389/Date-and-String-Function-in-BluePrism This article ...

  6. 从零开始学安全(四十一)●初识Wireshark

    wireshark:Beyond Compare是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与 ...

  7. Spring中关于AOP的实践之概念

    一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...

  8. 使用Python画玫瑰花

    ''' Created on Nov 18, 2017 @author: QiZhao ''' import turtle # 设置初始位置 turtle.penup() turtle.left(90 ...

  9. javascript 函数后面有多个小括号f( )( )( )...

    有时我们看见js函数后面跟着多个小括号是什么意思?f( )( )( )... f()执行f函数,返回子函数 f()()执行子函数,返回孙函数 f()()()执行孙函数,返回重孙函数 ... ... 但 ...

  10. EclipseAndroid打包签名发布安装失败闪退运行不了

    EclipseAndroid打包签名发布安装失败闪退运行不了 本来没怎么用过用Eclipse写安卓,可是有人有需要必须用Eclipse写,那就写呗. 可在签名打包的时候,发到手机上安装,提示安装成功. ...