jdk8新特性流Stream編程
看了網(wǎng)上一些性能的比較,這里自己寫一個進(jìn)行測試
對比以下四種
- 普通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 { ListlistUser = 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 getListUsers() { List listUser = new ArrayList (); 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(){ ListasList = 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表達(dá)式,遍歷起來很方便。
但是對于上述代碼中的//2 提示 變量i 應(yīng)該final修飾,或者 實際的final效果,也就是內(nèi)容部不可變。其實可以理解,lambda 實際上 是 匿名內(nèi)部類的一種特殊用法 所以 這樣寫 肯定有final問題。
其實 //2 就是 //1 中的改進(jìn)方法而已, jdk8中的forEach本來就是對jdk7中的for的更好的封裝,但是對于上述需求,jdk8中的forEach 很明顯不能滿足要求。
說到底,改進(jìn)是很好的,但是還是看具體的需求,各取所需吧,配合使用
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/xiewenfeng520/article/details/88724349