可以说,方法引用就是 Lambda 表达式、函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是 Lambda 表达式的一个语法糖。
1. 方法引用
1.1. 格式
- 使用方法引用操作符
::将类或对象与方法名分割开来。 - 如下四种主要使用情况:
-
- 对象:: 实例方法名
- 类 :: 静态方法名
- 类 :: 实例方法名
- 类 :: new
1.2. 使用要求
- Lambda 体只有一条语句,并且是通过调用一个对象的现有方法来完成的。
- 针对上面前三种使用情况:
-
- 情况一:函数式接口中的抽象方法 a 在被重写是使用了某一对象的方法 b。如果方法 a 的形参列表、返回值类型与方法 b 的形参列表、返回值类型都相同,则我们可以使用方法 b 实现对方法 a 的重写、替换。
- 情况二:函数式接口中的抽象方法 a 在被重写时使用了某个类的静态方法 b。如果方法 a 的形参列表、返回值类型与方法 b 的形参列表、返回值类型相同,则我们可以使用方法 b 实现对方法 a 的重写、替换。
- 情况三:函数式接口中的抽象方法a在被重写时使用了某一个对象的方法b。如果方法a的返回值类型与方法b的返回值类型相同,同时方法a的形参列表中有n个参数,方法b的形参列表有n-1个参数,且方法a的第1个参数作为方法b的调用者,且方法a的后n-1参数与方法b的n-1参数匹配(类型相同或满足多态场景也可以)
1.3. 使用实例
首先构造一个MethodReferenceExample 类作为辅助,结构如下:
public class MethodReferenceExample {
// 静态方法
public static int add(int a, int b) {
return a + b;
}
// 实例方法
public void print(String message) {
System.out.println(message);
}
// 主方法
public static void main(String[] args) {
// 示例代码
}
}
- 静态方法引用
import java.util.function.BiFunction;
public class MethodReferenceExample {
public static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> adder = MethodReferenceExample::add;
System.out.println(adder.apply(10, 20)); // 输出 30
}
}
BiFunction<T,U,R>: 抽象方法为 R apply(T t, U u),作用是接收一个 T 类型和一个 U 类型对象,返回一个 R 类型对象结果。
而MethodReferenceExample 类的 add 方法正是接收两个参数并返回一个结果,数据类型也刚好对得上。
- 实例方法引用
import java.util.function.Consumer;
public class MethodReferenceExample {
public void print(String message) {
System.out.println(message);
}
public static void main(String[] args) {
MethodReferenceExample example = new MethodReferenceExample();
Consumer<String> printer = example::print;
printer.accept("Hello, World!"); // 输出 Hello, World!
}
}
Consumer<T> : 抽象方法为 void accept(T t),作用是接收一个参数并进行一定的操作但是不返回值。
exmaple::print 则为 printer 提供了操作方式,即当实行 printer.accept(t)时会执行 example.print(t);
- 类的实例方法引用
import java.util.function.Function;
public class MethodReferenceExample {
public static void main(String[] args) {
Function<String, Integer> stringToInt = Integer::valueOf;
System.out.println(stringToInt.apply("123")); // 输出 123
}
}
Function<T , R> : 抽象方法为 R apply(T t),作用是接收一个参数 t,进行一定处理后返回类型为 R 的值。
- 构造方法引用
import java.util.function.Function;
public class MethodReferenceExample {
public static void main(String[] args) {
Function<String, Integer> stringToInt = Integer::new;
System.out.println(stringToInt.apply("456")); // 输出 456
}
}
2. 数组构造引用
格式: 数组类型名::new
eg:
@Test
public void test(){
Function<Integer,String[]> func1 = length -> new String[length];
String[] arr1 = func1.apply(5);
System.out.println(Arrays.toString(arr1));
System.out.println("*******************");
Function<Integer,String[]> func2 = String[] :: new;
String[] arr2 = func2.apply(10);
System.out.println(Arrays.toString(arr2));
}

被折叠的 条评论
为什么被折叠?



