156. Java Lambda 表达式 - 从 Lambda 到方法引用:深入理解 Java 的未绑定实例方法调用
未绑定的方法引用 是指引用一个实例方法。不同于静态方法引用,未绑定方法引用没有显式的类名,它是对对象实例方法的引用。通过方法引用,你可以简化那些常见的、重复的 lambda
表达式,提升代码的可读性和简洁性。
1. 未绑定的方法引用概述
未绑定的方法引用通常用于类的实例方法。这意味着我们引用的是某个对象的实例方法,而不是类本身的静态方法。
一般语法:
java
RefType::instanceMethod
其中,RefType
是类的类型,instanceMethod
是实例方法的名称。
2. 引用无参数的实例方法
假设你有一个 lambda 表达式,目的是获取字符串的长度:
java
Function<String, Integer> toLength = s -> s.length();
这段代码可以被简化为引用 String
类的实例方法 length()
,如下所示:
java
Function<String, Integer> toLength = String::length;
这个例子中,String::length
就是对 String
类的实例方法 length()
的引用。虽然看起来像是一个静态方法的调用,但它实际上引用的是一个实例方法。你可以通过对象实例来调用它,比如:
java
String word = "Hello";
int length = word.length(); // 调用实例方法
3. 引用实例的 getter 方法
未绑定方法引用常用于调用 JavaBean
的 getter
方法。例如,如果你有一个 User
类,里面有一个 getName()
方法,你可以使用未绑定方法引用来简化代码。
假设 User
类如下:
java
public class User {
private String name;
public String getName() {
return name;
}
}
你可以将以下的 lambda 表达式:
java
Function<User, String> getName = user -> user.getName();
替换成方法引用:
java
Function<User, String> getName = User::getName;
这里,User::getName
就是对 User
类的实例方法 getName()
的引用。通过方法引用,你能够简化获取属性的操作。
4. 引用带有多个参数的实例方法
未绑定方法引用也可以引用带有多个参数的实例方法。例如,如果你有一个 BiFunction
,它接受两个字符串,并且调用 String
类的 indexOf()
方法来查找一个字符串的位置:
使用 lambda 表达式:
java
BiFunction<String, String, Integer> indexOf = (sentence, word) -> sentence.indexOf(word);
这段代码可以用未绑定的方法引用简化为:
java
BiFunction<String, String, Integer> indexOf = String::indexOf;
这里,String::indexOf
就是引用 String
类的实例方法 indexOf()
,它接受两个参数:sentence
和 word
,返回 word
在 sentence
中出现的位置。
5. 总结未绑定的方法引用
未绑定的方法引用是指引用类的实例方法,不同于静态方法引用,它是通过类的对象实例来调用的方法。通常情况下,它可以简化 lambda 表达式,提升代码的可读性。
常见用法:
- 引用实例方法,如
String::length
或User::getName
。 - 引用带有多个参数的方法,如
String::indexOf
。
练习
-
将以下的 lambda 表达式用未绑定的方法引用替代:
javaFunction<String, String> toUpperCase = s -> s.toUpperCase();
答案:
java
Function<String, String> toUpperCase = String::toUpperCase;
vbnet
2. 将以下的 lambda 表达式用未绑定的方法引用替代:
```java
BiFunction<String, String, Integer> compare = (s1, s2) -> s1.compareTo(s2);
答案:
java
BiFunction<String, String, Integer> compare = String::compareTo;
通过这些练习,你可以更好地理解未绑定的方法引用,并在适当的场景中使用它们以简化代码。