## 一、什么是方法引用 方法引用(Method Reference)是 Java 8 引入的**简化 Lambda 表达式的语法糖**,允许直接引用已有方法而不是重新编写 Lambda 表达式。它们本质上是**指向现有方法或构造函数的短小简洁引用**。 ## 二、方法引用的用法 #### 1、引用静态方法 **语法:** `ClassName::staticMethodName` **适用场景:** 引用类的静态方法 **示例:** ```javascript // 等价于: (n) -> Math.sqrt(n) Function sqrt = Math::sqrt; System.out.println(sqrt.apply(25.0)); // 输出: 5.0 ``` #### 2、引用特定对象的实例方法 **语法:** `objectReference::instanceMethodName` **适用场景:** 引用特定对象的实例方法 **示例:** ```javascript List names = Arrays.asList("Alice", "Bob", "Charlie"); // 使用 Lambda names.forEach(name -> System.out.println(name)); // 使用方法引用(更简洁) names.forEach(System.out::println); ``` #### 3、引用任意对象的实例方法 **语法:** `ClassName::instanceMethodName` **适用场景:** 引用类型的任意对象的实例方法 **示例:** ```javascript // 等价于: (s1, s2) -> s1.compareTo(s2) Comparator comp = String::compareTo; List words = Arrays.asList("apple", "Banana", "cherry"); words.sort(String::compareToIgnoreCase); // 不区分大小写排序 ``` #### 4、引用构造方法 **语法:** `ClassName::new` **适用场景:** 创建对象实例 **示例:** ```javascript // 等价于: () -> new ArrayList<>() Supplier> listSupplier = ArrayList::new; // 等价于: (s) -> new Person(s) Function personFactory = Person::new; Person john = personFactory.apply("John"); ``` ## 三、与lambda表达式的区别 | 特性 | 方法引用 | Lambda 表达式 | | -------------- | ---------------------- | ---------------- | | **语法简洁性** | ⭐️⭐️⭐️⭐️⭐️ | ⭐️⭐️⭐️ | | **可读性** | 高(直接显示方法名) | 中等 | | **使用条件** | 必须匹配函数式接口 | 更灵活 | | **复用性** | 高(直接引用现有方法) | 低(需重新实现) | | **参数传递** | 自动推断 | 需显式声明 | ## 四、什么时候使用方法引用 #### 1、直接调用已有方法时 (如 `System.out::println`, `String::length`) #### 2、代码简洁性优先时 (方法引用通常更短更清晰) #### 3、方法名称即表达意图时 (如 `Object::equals` 比 `(a, b) -> a.equals(b)` 更明确) ## 五、注意事项 #### 1、方法签名必须匹配 方法引用的参数列表和返回类型必须与目标函数式接口兼容 #### 2、不支持额外处理逻辑 若方法调用前后需要添加逻辑,应使用 Lambda #### 3、`this` 关键字行为 在方法引用中,`this` 指向包含方法引用的类,而不是被引用的方法所属的类 #### 4、异常处理 被引用的方法抛出的异常,必须与函数式接口声明的异常兼容 Loading... ## 一、什么是方法引用 方法引用(Method Reference)是 Java 8 引入的**简化 Lambda 表达式的语法糖**,允许直接引用已有方法而不是重新编写 Lambda 表达式。它们本质上是**指向现有方法或构造函数的短小简洁引用**。 ## 二、方法引用的用法 #### 1、引用静态方法 **语法:** `ClassName::staticMethodName` **适用场景:** 引用类的静态方法 **示例:** ```javascript // 等价于: (n) -> Math.sqrt(n) Function<Double, Double> sqrt = Math::sqrt; System.out.println(sqrt.apply(25.0)); // 输出: 5.0 ``` #### 2、引用特定对象的实例方法 **语法:** `objectReference::instanceMethodName` **适用场景:** 引用特定对象的实例方法 **示例:** ```javascript List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // 使用 Lambda names.forEach(name -> System.out.println(name)); // 使用方法引用(更简洁) names.forEach(System.out::println); ``` #### 3、引用任意对象的实例方法 **语法:** `ClassName::instanceMethodName` **适用场景:** 引用类型的任意对象的实例方法 **示例:** ```javascript // 等价于: (s1, s2) -> s1.compareTo(s2) Comparator<String> comp = String::compareTo; List<String> words = Arrays.asList("apple", "Banana", "cherry"); words.sort(String::compareToIgnoreCase); // 不区分大小写排序 ``` #### 4、引用构造方法 **语法:** `ClassName::new` **适用场景:** 创建对象实例 **示例:** ```javascript // 等价于: () -> new ArrayList<>() Supplier<List<String>> listSupplier = ArrayList::new; // 等价于: (s) -> new Person(s) Function<String, Person> personFactory = Person::new; Person john = personFactory.apply("John"); ``` ## 三、与lambda表达式的区别 | 特性 | 方法引用 | Lambda 表达式 | | -------------- | ---------------------- | ---------------- | | **语法简洁性** | ⭐️⭐️⭐️⭐️⭐️ | ⭐️⭐️⭐️ | | **可读性** | 高(直接显示方法名) | 中等 | | **使用条件** | 必须匹配函数式接口 | 更灵活 | | **复用性** | 高(直接引用现有方法) | 低(需重新实现) | | **参数传递** | 自动推断 | 需显式声明 | ## 四、什么时候使用方法引用 #### 1、直接调用已有方法时 (如 `System.out::println`, `String::length`) #### 2、代码简洁性优先时 (方法引用通常更短更清晰) #### 3、方法名称即表达意图时 (如 `Object::equals` 比 `(a, b) -> a.equals(b)` 更明确) ## 五、注意事项 #### 1、方法签名必须匹配 方法引用的参数列表和返回类型必须与目标函数式接口兼容 #### 2、不支持额外处理逻辑 若方法调用前后需要添加逻辑,应使用 Lambda #### 3、`this` 关键字行为 在方法引用中,`this` 指向包含方法引用的类,而不是被引用的方法所属的类 #### 4、异常处理 被引用的方法抛出的异常,必须与函数式接口声明的异常兼容 最后修改:2025 年 10 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。