素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了

虽然Java 8已经出了好几年了 , 但是很多朋友可能对于其中的一些特性还是不太了解 。 甚至对lambda表达式这个特性可能会产生误解 , 误认为lambda表达式会影响程序的速度 。 其中也不乏很多误人子弟的自媒体传播这些错误的观点 。
素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了
今天我看到一篇自媒体推送的文章 , 号称用Java字节码分析为什么lambda表达式速度慢 , 但是其中漏洞百出 , 搞得我忍不住写了这么一篇文章 , 为一些受到误导的朋友纠正一个概念:lambda表达式和普通的循环一样 , 不会影响到程序速度 , 大家可以放心使用 。
因为头条压缩图片的缘故 , 所以对于小段代码 , 我用高亮代码图片的形式贴出 。 对于大段代码 , 直接贴代码 , 可能会影响大家的阅读体验 。 也希望头条能够允许上传高清图片 , 让大家的阅读体验更好一下 。
lambda表达式是什么可能还有一些朋友对lambda表达式还是不太清楚 , 所以我先介绍一下lambda表达式的概念 。 简单来说lambda表达式就是匿名函数 , 在一些支持匿名函数的语言中 , 用不用lambda表达式其实不是那么重要 。 但是因为Java不支持匿名函数 , 所以lambda表达式可以极大的简化这些场合的代码 。
先来看看一个例子 。 假如我们需要在一个新线程中运行代码 , 可能需要创建一个新的Runnable对象 。 此处使用了Java的一项特性匿名内部类 , 创建了一个新的临时的Runnable对象 。 但是代码如你所见非常难看 , 大段的缩进和方括号 , 非常影响阅读 。
素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了
如果换成了lambda表达式的实现 , 如你所见 , 代码非常干净整洁 。
素手烹茶|lambda表达式速度如何呢?看完这篇文章你就明白了
这种形如(a,b)->{ ..... }的表达式就是lambda表达式 。 上面已经提到过了 , lambda表达式其实就是匿名函数 , 箭头前面的括号内部的就是函数的参数列表;箭头后面的括号内部的就是方法体 , 假如方法体只有一行语句或者表达式 , 方法体的括号可以省略 。
lambda表达式参数的类型也不需要写明 , 编译器会自动从前面的类型中推断 。 在上面的例子中 , 因为Runnable中的run函数没有参数 , 所以lambda表达式自然也不需要参数 。 你可能会想到 , 假如类型中有多个函数怎么办呢?这时候编译器无法推断 , 程序就会报错 。 这也是Java lambda表达式的一个限制 , 前面的接口类型中只能有一个函数声明 。
很多古板的程序员不喜欢这个特性 , 认为它会影响到程序的可读性 。 但是实际情况恰恰相反 , 合理的利用lambda表达式 , 不仅不会污染代码的可读性 , 反而会大大加强可读性 。 lambda表达式这个特性 , 已经被现在很多新的编程语言吸收 , 足见其流行程度 。
错误的测试方法很多朋友可能对lambda表达式的运行速度产生疑问 , 会不会用了这种写法 , 程序的运行速度就会变慢呢?这种担心也是完全多余的 , Java作为一门经典的企业级应用开发语言 , Oracle对每个新添加的特性都是小心翼翼的 。 既然这个特性被添加到Java语言中 , 那么足以说明Oracle对其进行了深刻的优化 , 运行速度绝对是有保证的 , 就算比普通循环慢一点 , 也不会慢到哪里去 。
可能有些人用了错误的测试方法对lambda表达式进行了测试 , 发现速度不如普通的for循环 , 然后就得出结论:lambda表达式运行速度慢 。 这种测试是完全不负责任的 。 下面的代码就是一种错误的测试方法 , 测试结果:lambda表达式用时150毫秒 , 而普通循环用时7毫秒 。 因此得出结论:lambda表达式慢 。 大家可以看看代码 , 然后想想问题在哪里 。


推荐阅读