最近闲下来学习了下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循环的方法。