1. 程式人生 > >jdk1.8 lambda表示式應用及效能

jdk1.8 lambda表示式應用及效能

jdk1.7加入invokeDynamic指令來支援動態型別。詳見https://book.2cto.com/201301/14120.html

jdk1.8加入lambda表示式,實際使用invokeDynamic指令來實現。

1 lambda表示式的應用

java的語法出了名的繁雜冗餘,使用lambda表示式,程式碼更簡潔,比如集合處理。

//元素過濾
List<Entity> filter = entities.stream().filter((e)->{return e.a==0;}).collect(Collectors.toList());
//欄位抽取
List<Integer> field = entities.stream().map((e)->{return e.a;}).collect(Collectors.toList());
//list轉map
Map<Integer, Entity> map = entities.stream().collect(Collectors.toMap(Entity::getA, e->e));
//map迭代
map.forEach((k,v)->{});
//list迭代
entities.forEach((e)->{});

2 lambda表示式的效能

可以猜想,由於使用invokeDynamic指令,類和方法需要在執行時才解析,比傳統的方法呼叫應該會慢一些,實驗一下。

public boolean converter(){
	int count = 10000;
	
	Converter<Integer> converter = (inte)->{
		System.out.println(inte);
		};
	
	long startTime = System.currentTimeMillis();
	for(int i=0;i<count;i++){
		converter.convert(i);
	}
	long lambdaCost = System.currentTimeMillis()-startTime;	
	
	Converter<Integer> converterOld = new Converter<Integer>(){
		@Override
		public void convert(Integer t) {
			System.out.println(t);
			}
	};
	
	startTime = System.currentTimeMillis();
	for(int i=0;i<count;i++){
		converterOld.convert(i);
	}
	long normalCost = System.currentTimeMillis()-startTime;
	
	return normalCost>lambdaCost;
}


public static void main(String[] args) {
	int normalWin = 0;
	int total = 10;
	Lambda lambda =  new Lambda();
	for(int i=1;i<=total;i++){
		if(lambda.converter()){
			normalWin++;
		}
	}
	System.out.println("total:"+total+",normal win:"+normalWin);
}
total:10,normal win:3
total:10,normal win:5
total:10,normal win:4
total:10,normal win:6
total:10,normal win:7

結果顯示,使用lambda表示式執行並不比常規呼叫慢,不相上下,jdk1.8確實給力。

此種神器,當多多使用了。