方法引用和Lambda表达式的效率有何不同?代码举例讲解

方法引用和 Lambda 表达式都用于实现函数式接口,但在效率方面有一定的差异。

以下是几点不同之处:

  1. 方法引用会直接对应到已有的方法实现,而 Lambda 表达式需要额外创建一个匿名类。所以,方法引用在这点上会更加高效。
  2. 方法引用对应到的方法是已存在的,所以不需要额外加载和链接,而 Lambda 表达式需要加载和链接对应的匿名类。所以,方法引用在这点上也更高效。
  3. 方法引用无需创建 Stack Frame,而 Lambda 表达式需要为匿名类的方法创建 Stack Frame。所以,在这点上方法引用也更高效。
  4. 方法引用可以利用已有的方法优化,如栈上分配空间等,而 Lambda 表达式对应的匿名类方法则需要从头优化。所以,方法引用在这点上也更高效。

代码示例:

方法引用:

list.forEach(System.out::println);

Lambda 表达式:

list.forEach((e) -> System.out.println(e)); 

在上例中,方法引用 System.out::println 直接对应 System.out.println() 方法,所以在效率上会优于Lambda表达式 (e) -> System.out.println(e)。

此外,方法引用还可以使 JIT 优化工作更加高效。因为 JIT 编译器可以直接优化到对应方法的实现,而Lambda表达式中的匿名类方法在优化时需要更多猜测。

但是,并不是方法引用总是比 Lambda 表达式更高效,这还依赖具体使用环境。但从理论上,在绝大多数场景下,方法引用在效率上会更占优势。所以,如果在代码中既可以使用方法引用,又可以使用Lambda表达式,优先选择方法引用会让代码稍微更高效一些。