欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于JDK8-lambda表達式四種forEach性能對比

 更新時間:2021年07月28日 09:58:07   作者:不懂的浪漫  
這篇文章主要介紹了基于JDK8-lambda表達式四種forEach性能對比,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

jdk8新特性流Stream編程

看了網(wǎng)上一些性能的比較,這里自己寫一個進行測試

對比以下四種

  • 普通forEach、
  • java8中新的forEach、
  • stream+forEach、
  • parallelStream+forEach
package com.huajie.Lambda; 
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
 
@Slf4j
public class Mode2 {
    List<User> listUser = new ArrayList<>();
    @Before
    public void initList() {
        listUser = this.getListUsers();
    }
 
    @Test
    public void test() {
        //一般forEach
        long startSimpleTime = System.currentTimeMillis();
        for (User user : listUser) {
            user.toString();
        }
        long endSimpleTime = System.currentTimeMillis();
        System.out.println("Simple:" + (endSimpleTime - startSimpleTime));
 
        //java8中新的forEach
        long startLambda = System.currentTimeMillis();
        listUser.forEach(User::toString);
        long endLambda = System.currentTimeMillis();
        System.out.println("Lambda:" + (endLambda - startLambda));
 
        //java8中新的stream+forEach
        long startStream = System.currentTimeMillis();
        listUser.stream().forEach(User::toString);
        long endStream = System.currentTimeMillis();
        System.out.println("Stream:" + (endStream - startStream));
 
        //java8中新的parallelStream+forEach
        long startParallelStream = System.currentTimeMillis();
        listUser.parallelStream().forEach(User::toString);
        long endParallelStream = System.currentTimeMillis();
        System.out.println("ParallelStream:" + (endParallelStream - startParallelStream));
    }
 
    private List<User> getListUsers() {
        List<User> listUser = new ArrayList<User>();
        for (int i = 0; i < 10000000; i++) {
            listUser.add(new User("user" + i, i));
        }
        return listUser;
    }
}
package com.huajie.Lambda;
import lombok.Data;
@Data
public class User {
    private String name;
    private Integer age;
 
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

1000W條數(shù)據(jù)

100W條數(shù)據(jù)

10W條數(shù)據(jù)

1W條數(shù)據(jù)

1000條數(shù)據(jù)

java8中新加入的forEach和普通的forEach臨界值大概在150W條

由以上測試能得到的結(jié)果:

150W條數(shù)據(jù)以下and10W以上:lambda>simple>stream>paralleStream

150W條數(shù)據(jù)以上:simple>lambda>stream>paralleStream

從性能上考慮:小數(shù)據(jù)量用普通的forEach就可以,沒有必要使用java8中的新出來的幾種,已經(jīng)在項目中使用的也不需要改回來,10W條也就幾毫秒的差距

jdk8中forEach使用問題

實話說,jdk8出來好久了,公司一直用的還是jdk7,沒有升級,最近終于升級到j(luò)dk8了,所以來自己改改代碼,使用jdk8中的新特性,最簡單的forEach先來試試

測試代碼如下:

public static void testJDK8ForEach(){
  List<String> asList = Arrays.asList("a","b","a","d");
  int i=0;
  // jdk7 for
  for(String s:asList){
   if(s.equals("a")){
    ++i;
   }
  }
  //2  jdk8 forEach
  asList.forEach(s -> {
   if(s.equals("a")){
    ++i;  // Local variable i defined in an enclosing scope must be final or effectively final
   }
  });
  System.out.println(i);
  //3  jdk8 stream
  long count = asList.stream().filter(s -> s.equalsIgnoreCase("a")).count();
  System.out.println(count);
 }

首先forEach 的確很好用,配合lambda表達式,遍歷起來很方便。

但是對于上述代碼中的//2 提示 變量i 應(yīng)該final修飾,或者 實際的final效果,也就是內(nèi)容部不可變。其實可以理解,lambda 實際上 是 匿名內(nèi)部類的一種特殊用法 所以 這樣寫 肯定有final問題。

其實 //2 就是 //1 中的改進方法而已, jdk8中的forEach本來就是對jdk7中的for的更好的封裝,但是對于上述需求,jdk8中的forEach 很明顯不能滿足要求。

說到底,改進是很好的,但是還是看具體的需求,各取所需吧,配合使用

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文詳解Java閉鎖和柵欄的實現(xiàn)

    一文詳解Java閉鎖和柵欄的實現(xiàn)

    閉鎖與柵欄是在多線程編程中的概念,因為在多線程中,我們不能控制線程的執(zhí)行狀態(tài),所以給線程加鎖,讓其按照我們的想法有秩序的執(zhí)行。本文將詳解Java閉鎖和柵欄的實現(xiàn),需要的可以參考一下
    2022-06-06
  • SpringCloud?OpenFeign概述與使用教程

    SpringCloud?OpenFeign概述與使用教程

    OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠程調(diào)用,都像調(diào)用本地方法一樣完成
    2023-02-02
  • SpringBoot開發(fā)中的組件和容器詳解

    SpringBoot開發(fā)中的組件和容器詳解

    這篇文章主要介紹了SpringBoot開發(fā)中的組件和容器詳解,SpringBoot 提供了一個內(nèi)嵌的 Tomcat 容器作為默認(rèn)的 Web 容器,同時還支持其他 Web 容器和應(yīng)用服務(wù)器,需要的朋友可以參考下
    2023-09-09
  • Java生成隨機數(shù)的2種示例方法代碼

    Java生成隨機數(shù)的2種示例方法代碼

    在Java中,生成隨機數(shù)有兩種方法。1是使用Random類。2是使用Math類中的random方法??聪旅娴睦邮褂冒?/div> 2013-11-11
  • SPFA算法的實現(xiàn)原理及其應(yīng)用詳解

    SPFA算法的實現(xiàn)原理及其應(yīng)用詳解

    SPFA算法,全稱為Shortest?Path?Faster?Algorithm,是求解單源最短路徑問題的一種常用算法,本文就來聊聊它的實現(xiàn)原理與簡單應(yīng)用吧
    2023-05-05
  • java 判斷二進制文件的方法

    java 判斷二進制文件的方法

    這篇文章主要介紹了java 判斷二進制文件的方法的相關(guān)資料,這里提供實例來實現(xiàn)判斷文件是否問二進制文件,希望能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 排序算法的Java實現(xiàn)全攻略

    排序算法的Java實現(xiàn)全攻略

    這篇文章主要介紹了排序算法的Java實現(xiàn),包括Collections.sort()的使用以及各種經(jīng)典算法的Java代碼實現(xiàn)方法總結(jié),超級推薦!需要的朋友可以參考下
    2015-08-08
  • Java實現(xiàn)視頻初步壓縮和解壓的代碼示例

    Java實現(xiàn)視頻初步壓縮和解壓的代碼示例

    從攝像頭讀取每一幀的圖片,用一些簡單的方法將多張圖片信息壓縮到一份文件中(自定義的視頻文件),自定義解碼器讀取視頻文件,并將每幀圖片展示成視頻,本文主要介紹了Java實現(xiàn)視頻初步壓縮和解壓,需要的朋友可以參考下
    2023-10-10
  • JavaGUI事件監(jiān)聽機制超詳細(xì)講解

    JavaGUI事件監(jiān)聽機制超詳細(xì)講解

    Java事件監(jiān)聽器是由事件類和監(jiān)聽接口組成,自定義一個事件前,必須提供一個事件的監(jiān)聽接口以及一個事件類。JAVA中監(jiān)聽接口是繼承java.util.EventListener的類,事件類繼承java.util.EventObject的類
    2023-03-03
  • 圖文詳解java反射機制及常用應(yīng)用場景

    圖文詳解java反射機制及常用應(yīng)用場景

    這篇文章主要為大家介紹了圖文詳解java反射機制及常用應(yīng)用場景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03

最新評論