赞
踩
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确实给力。
此种神器,当多多使用了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。