最近閒下來學習了下java8 的新特性,方法引用、lambda表達式、函數式編程、流等新特性。
想試下使用流的方式進行集合的循環的效率和其它幾種循環的效率差別,就做了個小實驗。
先將測試代碼貼出來
package cn.com.trying.test.util;
import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
public class LambdaTest {
public static void main(String args[]) {
List<Apple> appleList = getCopyAppleList(10000000,"");
List<Apple> streamList = testStream(appleList);
List<Apple> forList = testFor(appleList);
testFor1(appleList);
List<Apple> iteraterList = testIterater(appleList);
testWhile(appleList);
}
private static List<Apple> testStream(List<Apple> appleList){
long curTime = System.currentTimeMillis();
List<Apple> list = appleList.stream().filter((Apple a) -> "green".equals(a.getColor())).collect(Collectors.toList());
long newTime = System.currentTimeMillis();
System.out.println("stream方式--------------"+(newTime-curTime));
return list;
}
private static List<Apple> testFor(List<Apple> appleList){
List<Apple> list = Lists.newArrayList();
long curTime = System.currentTimeMillis();
for(Apple apple : appleList){
if("green".equals(apple.getColor())){
list.add(apple);
}
}
long newTime = System.currentTimeMillis();
System.out.println("for方式--------------"+(newTime-curTime));
return list;
}
private static List<Apple> testFor1(List<Apple> appleList){
List<Apple> list = Lists.newArrayList();
long curTime = System.currentTimeMillis();
for(int i= 0; i< appleList.size();i++){
Apple apple = appleList.get(i);
if("green".equals(apple.getColor())){
list.add(apple);
}
}
long newTime = System.currentTimeMillis();
System.out.println("for1方式--------------"+(newTime-curTime));
return list;
}
private static List<Apple> testIterater(List<Apple> appleList){
List<Apple> list = Lists.newArrayList();
long curTime = System.currentTimeMillis();
Iterator<Apple> iterator = appleList.iterator();
while(iterator.hasNext()){
Apple apple = iterator.next();
if("green".equals(apple.getColor())){
list.add(apple);
}
}
long newTime = System.currentTimeMillis();
System.out.println("iterator方式--------------"+(newTime-curTime));
return list;
}
private static List<Apple> testWhile(List<Apple> appleList){
List<Apple> list = Lists.newArrayList();
long curTime = System.currentTimeMillis();
int total = appleList.size();
int count = 0;
while(count < total){
Apple apple = appleList.get(count);
if("green".equals(apple.getColor())){
list.add(apple);
}
count += 1;
}
long newTime = System.currentTimeMillis();
System.out.println("while方式--------------"+(newTime-curTime));
return list;
}
/**
* @Title:
* @Description: 創建測試數據集合 注意new對象消耗比copy對象的消耗要大很多
* @param
* @return
* @author huxx
* @date 2020/3/14 上午10:17
* @update
*/
public static List<Apple> getCopyAppleList(int count,String color){
long cur = System.currentTimeMillis();
Apple p = new Apple();
List<Apple> list = Lists.newArrayList();
for(int i = 0;i < count; i++){
Apple apple =p;
apple.setColor(color);
list.add(apple);
}
long end = System.currentTimeMillis();
System.out.println("數據創建時間----"+(end - cur)+"---"+list.size());
return list;
}
public static List<Apple> getNewAppleList(int count,String color){
long cur = System.currentTimeMillis();
List<Apple> list = Lists.newArrayList();
for(int i = 0;i < count; i++){
Apple apple = new Apple();
apple.setColor(color);
list.add(apple);
}
long end = System.currentTimeMillis();
System.out.println("數據創建時間----"+(end - cur));
return list;
}
}
運行結果如下圖
從運行結果來看使用java新特性的stream方式速度還是快一點,而且寫法結合lambda的寫法,非常簡明清晰。推薦使用stream循環的方法。