Java方法引用是一种简洁的语法,允许开发者直接引用已存在的方法,而无需编写额外的Lambda表达式这种特性在Java 8中被引入,作为Lambda表达式的补充,使得代码更加紧凑和易读。
一、Java方法引用的基本概念
java
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] array = new String[]{"Apple", "Orange", "Banana", "Lemon"};
Arrays.sort(array, Main::cmp);
System.out.println(String.join(", ", array));
static int cmp(String s1, String s2) {
return pareTo(s2);
在上述代码中,`Arrays.sort(array, Main::cmp);`直接传入了静态方法`cmp`的引用,用`Main::cmp`表示。因为`Comparator
二、Java方法引用的分类
Java中的方法引用有四种类型,每种类型的使用方式有所不同:
| 类型 | 语法 | 示例 |
|-|-|-|
| 静态方法引用 | `Class::static_method` | `cars.forEach(Car::collide);` |
| 特定对象的方法引用 | `instance::method` | `final Car police = Car.create(Car::new); cars.forEach(police::follow);` |
| 特定类的任意对象的方法引用 | `Class::method` | `cars.forEach(Car::repair);` |
| 构造方法引用 | `Class::new` | `final Car car = Car.create(Car::new); final List
三、Java方法引用的使用场景
java
import java.util.function.Consumer;
public class MethodReferencesDemo1 {
public static void main(String[] args) {
Consumer
consumer.accept("只消费,不返回");
这里`System.out.println(s)`这个表达式被替换成了`System.out::println`,因为`System.out.println(s)`这个操作已经有现成的方法实现,所以可以使用方法引用。
四、Java方法引用与Lambda表达式的区别
| 特性 | Lambda表达式 | 方法引用 |
|-|-|-|
| 使用场景 | 通常用于匿名函数的定义和传递 | 通常用于重用已有的方法 |
| 方法调用时机 | 作为参数传递给另一个方法时,会在运行时动态地创建一个实现函数式接口的匿名对象,并执行其中的方法 | 在编译时就确定了要调用的方法 |
| 代码简洁性 | 相对较长,尤其是当只是调用一个已存在的方法时 | 更简洁,是一种更紧凑、易读的Lambda表达式 |
| 示例 | `Comparator