方法引用
一、方法引用的本质
- 还是lambda表达式,本质上还是函数式接口的实例。
二、方法引用的使用
-
1、使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用
-
2、方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用中的相同
-
3、使用格式: 类(或对象):: 方法名
-
4、具体分为如下的三种情况:
对象::非静态方法
public void test1(){ //Lambda表达式 Consumer<String> con1 = str -> System.out.println(str); con1.accept("北京"); System.out.println("************************"); //方法引用 PrintStream ps = System.out; Consumer<String> con2 = ps::println; con2.accept("上海"); } public void test2(){ //Lambda表达式 Employee emp = new Employee("1001","Tom",23,5600); Supplier<String> sup1 = () -> emp.getName(); System.out.println(sup1.get()); System.out.println("***********************"); //方法引用 Supplier<String> sup2 = emp::getName; System.out.println(sup2.get()); }
类::静态方法
public void test3(){ //Lambda表达式 Comparator<Integer> com1 = (t1, t2) -> Integer.compare(t1, t2); System.out.println(com1.compare(12, 21)); System.out.println("***********************"); //方法引用 Comparator<Integer> com2 = Integer::compare; System.out.println(com2.compare(12, 21)); } public void test4(){ //Lambda表达式 Function<Double,Long> func1 = d -> Math.round(d); System.out.println(func1.apply(12.6)); System.out.println("******************"); //方法引用 Function<Double,Long> func2 = Math::round; System.out.println(func2.apply(12.6)); }
类::非静态方法
Comparator 中的int compare(T t1, T t2) 第一个参数当做方法引用类的对象
String 中的int t1.compareTo(t2)
public void test5(){ //Lambda表达式 Comparator<String> com1 = (s1, s2) -> s1.compareTo(s2); System.out.println(com1.compare("abc","abd")); System.out.println("*********************"); //方法引用 Comparator<String> com2 = String::compareTo; System.out.println(com2.compare("abc","abm")); }
三、拓展
-
1、构造器引用
-
和方法引用类似,函数式接口的抽象方法的形参列表和构造器的参数列表一致。
-
抽象方法的返回值的类型即为构造器所属的类的类型
- Supplier中的 T get()
- Employee中的空参构造器:Employee()
public void test6(){ //Lambda表达式 Supplier<Employee> sup1 = () -> new Employee(); System.out.println(sup1.get()); System.out.println("********************"); //方法引用 Supplier<Employee> sup2 = Employee::new; System.out.println(sup2.get()); }
- Function中的R apply(T t)
- Employee中的一个参数的构造器:Employee(int id)
public void test7(){ //Lambda表达式 Function<String, Employee> func1 = (s) -> new Employee(s); System.out.println(func1.apply("2211")); System.out.println("********************"); //方法引用 Function<String, Employee> func2 = Employee::new; System.out.println(func2.apply("2211")); }
-
2、数组引用
-
Function 中的R apply(T t)
``` java public void test8(){ //Lambda表达式 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)); } ```
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!