方法引用是Java 8中引入的一个特性,它让我们可以更简洁地使用已有的方法。在了解方法引用之前,我们先来看看为什么需要它。
通常在Java中,我们会通过lambda表达式来传递一些行为,比如说我们有一个列表,想对列表中的每个元素打印出来,我们可能会写一个lambda表达式。虽然lambda表达式已经很简洁了,但是如果我们要做的事情只是调用一个已经存在的方法,lambda表达式可能还是显得有点冗长。
这时候,方法引用就派上用场了。方法引用就像是给现成的方法起了个“快捷方式”,让我们可以直接使用。
方法引用有几种常见的形式:
-
静态方法引用:它的格式是
类名::静态方法名
。比如说,我们有一个静态方法可以比较两个字符串,那么我们可以通过string::compareTo
来引用这个方法。 -
实例方法引用:它的格式是
实例对象::实例方法名
。比如说,我们有一个字符串对象str
,想使用它的toUpperCase
方法,就可以写成str::toUpperCase
。 -
特定类的任意对象的方法引用:它的格式是
类名::实例方法名
。比如说,我们想对一个字符串列表里的每个字符串调用toUpperCase
方法,可以写成String::toUpperCase
。 -
构造器引用:它的格式是
类名::new
,用于调用类的构造函数。比如说,我们想创建一个新的ArrayList对象,可以写成ArrayList::new
。
方法引用的应用场景主要是在需要传递行为的地方,比如说集合的流操作中。举个例子:
- 在排序操作中,如果我们有一个比较方法,可以直接使用方法引用传递给排序函数。
- 在流操作中,我们可以通过方法引用来替代一些简单的lambda表达式,比如
stream.forEach(System.out::println)
,这就比写成stream.forEach(x -> System.out.println(x))
更简洁。
总结来说,方法引用让代码更清晰、更简洁,是对lambda表达式的一种补充。它特别适合用在那些需要传递行为的场合,尤其是当我们已经有现成的方法可以直接使用的时候。