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确实给力。
此种神器,当多多使用了。