虽然Java 8已经出了好几年了,但是很多朋友可能对于其中的一些特性还是不太了解。甚至对lambda表达式这个特性可能会产生误解,误认为lambda表达式会影响程序的速度。其中也不乏很多误人子弟的自媒体传播这些错误的观点。
今天我看到一篇自媒体推送的文章,号称用Java字节码分析为什么lambda表达式速度慢,但是其中漏洞百出,搞得我忍不住写了这么一篇文章,为一些受到误导的朋友纠正一个概念:lambda表达式和普通的循环一样,不会影响到程序速度,大家可以放心使用。
因为头条压缩图片的缘故,所以对于小段代码,我用高亮代码图片的形式贴出。对于大段代码,直接贴代码,可能会影响大家的阅读体验。也希望头条能够允许上传高清图片,让大家的阅读体验更好一下。
lambda表达式是什么
可能还有一些朋友对lambda表达式还是不太清楚,所以我先介绍一下lambda表达式的概念。简单来说lambda表达式就是匿名函数,在一些支持匿名函数的语言中,用不用lambda表达式其实不是那么重要。但是因为Java不支持匿名函数,所以lambda表达式可以极大的简化这些场合的代码。
先来看看一个例子。假如我们需要在一个新线程中运行代码,可能需要创建一个新的Runnable对象。此处使用了Java的一项特性匿名内部类,创建了一个新的临时的Runnable对象。但是代码如你所见非常难看,大段的缩进和方括号,非常影响阅读。
如果换成了lambda表达式的实现,如你所见,代码非常干净整洁。
这种形如(a,b)->{ ..... }的表达式就是lambda表达式。上面已经提到过了,lambda表达式其实就是匿名函数,箭头前面的括号内部的就是函数的参数列表;箭头后面的括号内部的就是方法体,假如方法体只有一行语句或者表达式,方法体的括号可以省略。
lambda表达式参数的类型也不需要写明,编译器会自动从前面的类型中推断。在上面的例子中,因为Runnable中的run函数没有参数,所以lambda表达式自然也不需要参数。你可能会想到,假如类型中有多个函数怎么办呢?这时候编译器无法推断,程序就会报错。这也是Java lambda表达式的一个限制