jdk1.8 lambda表示式應用及效能
阿新 • • 發佈:2019-01-26
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確實給力。
此種神器,當多多使用了。