從連結串列的迭代遍歷看java lambda表示式效率
阿新 • • 發佈:2019-02-10
隨著JDK1.8的釋出,lambda和函數語言程式設計終於進入到java世界。在用了一段時間,甚至可以說是在硬往lambda和流API上靠。有一天,在跟著大牛學習java時,一句“lambda拖慢程式”突然讓我意識到了什麼,於是我做了個測試。現在,靜下心來,回顧一下那個測試。
一個很簡單的測試,就是一個List的遍歷,我們看看這段程式碼:
import java.util.List; import java.util.ArrayList; import java.util.Iterator; public class ListForEach { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { list.add(i); } long start = System.nanoTime(); Iterator<Integer> iter = list.iterator(); while (iter.hasNext()) { Integer i = iter.next(); } long finish = System.nanoTime(); System.out.println(finish - start + "ns"); long begin = System.nanoTime(); for (Integer n : list) { Integer i = n; } long end = System.nanoTime(); System.out.println(end - begin + "ns"); long head = System.nanoTime(); list.forEach( t -> {Integer i = t;}); long tail = System.nanoTime(); System.out.println(tail - head + "ns"); } }
這是執行結果:
直觀點,換一個柱狀圖:
可以看見Lambda的遍歷時間和迭代器以及for-each相差巨大。
因此,使用傳統的方式遍歷,比lambda效率確實要高上很多。