在Java 8之前,可以通过使用匿名内部类来实现lambda功能。例如:
interface Lambda {
void doStuff();
}
// ...
public void doWithCallback(Lambda callback) {
// ...
callback.doStuff();
}
// ...
doWithCallback(new Lambda {
public void doStuff() {
// ...
}
});
就性能而言,仍然使用这种方法和使用新的Java 8 lambdas之间有区别吗?
答案 0 :(得分:78)
Oracle发布了一项比较Lambdas和匿名类之间性能的研究
请参阅Sergey Kuksenko的JDK 8: Lambda Performance Study,这是长达74张幻灯片。
总结:热身的速度很慢,但是当JIT将最坏的情况列为最快的情况时,就像匿名课一样快,但可以更快。
答案 1 :(得分:-4)
正如我发现的那样,使用Stream迭代数组的工作要慢得多(74张幻灯片不考虑这种情况)。我认为这不是lambda中唯一的性能泄漏(猜测,它将来会有所改进)。以下示例使用Java 8运行,没有任何选项:
//Language is an enum
Language[] array = Language.values();
System.err.println(array.length); // 72 items
long t = System.nanoTime();
for (Language l : array) System.out.println(l.getLanguageName());
System.err.println(System.nanoTime()-t); //nano time 1864724
t = System.nanoTime();
Arrays.stream(array).forEach(v -> System.out.println(v.getLanguageName()));
System.err.println(System.nanoTime()-t); //nano time 55812625 (55812625/1864724 = 29.93 times longer)
List<Language> list = Arrays.asList(array);
t = System.nanoTime();
for (Language l : list) System.out.println(l.getLanguageName());
System.err.println(System.nanoTime()-t); //nano time 1435008
t = System.nanoTime();
list.forEach(v -> System.out.println(v.getLanguageName()));
System.err.println(System.nanoTime()-t); //nano time 1619973 (1619973/1435008 = 1.128 times longer)