方法引用(Method Reference)是 Java 8 中的一个新特性,它可以简化代码并提高可读性。方法引用可以看作是 Lambda 表达式的一种快捷写法,它可以直接引用已有方法或者构造方法,而不需要像 Lambda 表达式那样,重新定义一个方法体。
方法引用可以分为四种类型:
1. 静态方法引用
语法:ClassName::staticMethodName
例如:
IntFunction<String> intToString = Integer::toString;
这里将 Integer 类中的静态方法 toString() 引用为 intToString。
在例一中,intToString 是一个 IntFunction<String> 类型的对象,它将一个 Integer 类型的参数转换为 String 类型的结果。可以通过调用该对象的 apply() 方法来使用它。例如:
IntFunction<String> intToString = Integer::toString;
String str = intToString.apply(123);
System.out.println(str); // 输出 "123"
这里将整数 123 作为参数传递给 intToString 对象的 apply() 方法,该方法将其转换为字符串类型并返回,然后将结果赋值给 str 变量并输出。
2. 实例方法引用
语法:instance::instanceMethodName
例如:
String str = "hello";
Function<Integer, Character> func = str::charAt;
这里将 String 类中的实例方法 charAt() 引用为 func。
在例二中,我们将 String 类中的实例方法 charAt() 引用为 func,即将 func 定义为一个 Function 对象,它接收一个 Integer 类型的参数,返回一个 Character 类型的结果,具体使用方法可以如下:
String str = "hello";
Function<Integer, Character> func = str::charAt;
Character result = func.apply(2); // 返回 'l'
System.out.println(result);
这里我们先定义了一个字符串 str,然后将实例方法 charAt() 引用为 func。接着我们调用 func 的 apply() 方法,传入参数 2,返回结果为 'l'。这样就可以简洁地获取字符串中指定位置的字符了。
3. 对象方法引用
语法:ClassName::instanceMethodName
例如:
BiPredicate<String, String> b = String::startsWith;
这里将 String 类中的实例方法 startsWith() 引用为 b。
在例三中,我们将 String 类中的实例方法 startsWith() 引用为 b,即将 b 定义为一个 BiPredicate 对象,它接收两个 String 类型的参数,返回一个 boolean 类型的结果,具体使用方法可以如下:
BiPredicate<String, String> b = String::startsWith;
boolean result = b.test("hello", "he"); // 返回 true
System.out.println(result);
这里我们先将实例方法 startsWith() 引用为 b。接着我们调用 b 的 test() 方法,传入两个字符串参数 "hello" 和 "he",返回结果为 true,因为 "hello" 以 "he" 开头。这样就可以简洁地判断一个字符串是否以指定的前缀开头了。
4. 构造方法引用
语法:ClassName::new
例如:
Supplier<List<String>> listSupplier = ArrayList::new;
这里将 ArrayList 的构造方法引用为 listSupplier。
方法引用的优点在于可以简化代码,并提高可读性和可维护性。在某些情况下,使用方法引用可以使代码更加简洁、清晰、易于理解和维护。
在例四中,我们将 ArrayList 的构造方法引用为 listSupplier,即将 listSupplier 定义为一个 Supplier 对象,它不接收任何参数,返回一个 List<String> 类型的结果,具体使用方法可以如下:
Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();
list.add("hello");
list.add("world");
System.out.println(list); // 输出 [hello, world]
这里我们先将 ArrayList 的构造方法引用为 listSupplier。接着我们调用 listSupplier 的 get() 方法,返回一个 ArrayList 对象。然后我们向 list 中添加两个字符串元素 "hello" 和 "world",最后打印出 list 的内容,输出为 [hello, world]。这样就可以简洁地创建一个 ArrayList 并向其中添加元素了。