jdk1.8 lambda表达式应用及性能

jdk1.7加入invokeDynamic指令来支持动态类型。详见https://book.2cto.com/201301/14120.html

jdk1.8加入lambda表达式,实际使用invokeDynamic指令来实现。


1 lambda表达式的应用

java的语法出了名的繁杂冗余,使用lambda表达式,代码更简洁,比如集合处理。

//元素过滤
List filter = entities.stream().filter((e)->{return e.a==0;}).collect(Collectors.toList());
//字段抽取
List field = entities.stream().map((e)->{return e.a;}).collect(Collectors.toList());
//list转map
Map 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 converter = (inte)->{
		System.out.println(inte);
		};
	
	long startTime = System.currentTimeMillis();
	for(int i=0;i converterOld = new Converter(){
		@Override
		public void convert(Integer t) {
			System.out.println(t);
			}
	};
	
	startTime = System.currentTimeMillis();
	for(int i=0;ilambdaCost;
}


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确实给力。

此种神器,当多多使用了。

你可能感兴趣的:(后端Java)