1. 方法引用介绍
方法引用其实是lambda表达式的升级写法,采用::
固定语法,可以使代码更简洁、紧凑;
2. 方法引用的5种类型
2.1 对象引用::实例方法名
函数式接口抽象方法的形参列表与实例方法的一致,且方法的返回值类型一致;
| public class MethodReferencesTest { |
| |
| public static void main(String[] args) { |
| |
| MethodReferencesTest methodReferencesTest = new MethodReferencesTest(); |
| |
| Integer r1 = MethodReferencesTest.getResult((a, b) -> methodReferencesTest.sum(a, b)); |
| System.out.println("r1:" + r1); |
| |
| Integer r2 = MethodReferencesTest.getResult(methodReferencesTest::sum); |
| System.out.println("r2:" + r2); |
| } |
| |
| public static Integer getResult(CalculateInterface calculateInterface) { |
| return calculateInterface.calculate(123, 456); |
| } |
| |
| |
| |
| |
| public Integer sum(Integer a, Integer b) { |
| return a + b; |
| } |
| } |
| |
| @FunctionalInterface |
| interface CalculateInterface { |
| |
| |
| |
| Integer calculate(Integer a, Integer b); |
| } |
| |
2.2 类名::静态方法名
函数式接口抽象方法的形参列表与静态方法的一致,且方法的返回值类型一致;
| public class MethodReferencesTest { |
| |
| public static void main(String[] args) { |
| |
| Integer r1 = MethodReferencesTest.getResult((a, b) -> MethodReferencesTest.sum(a, b)); |
| System.out.println("r1:" + r1); |
| |
| Integer r2 = MethodReferencesTest.getResult(MethodReferencesTest::sum); |
| System.out.println("r2:" + r2); |
| } |
| |
| public static Integer getResult(CalculateInterface calculateInterface) { |
| return calculateInterface.calculate(123, 456); |
| } |
| |
| |
| |
| |
| public static Integer sum(Integer a, Integer b) { |
| return a + b; |
| } |
| } |
| |
| @FunctionalInterface |
| interface CalculateInterface { |
| |
| |
| |
| Integer calculate(Integer a, Integer b); |
| } |
| |
2.3 类名::实例方法名
函数式接口抽象方法的第一个参数是实例方法所在类的对象,剩下的参数(或无参)是实例方法的入参,且方法的返回值类型一致;
| public class MethodReferencesTest { |
| |
| public static void main(String[] args) { |
| |
| boolean r1 = MethodReferencesTest.getResult((a, b) -> a.equals(b)); |
| System.out.println("r1:" + r1); |
| |
| boolean r2 = MethodReferencesTest.getResult(CalculateEntity::equals); |
| System.out.println("r2:" + r2); |
| } |
| |
| public static Boolean getResult(CalculateInterface calculateInterface) { |
| CalculateEntity a = new CalculateEntity(123); |
| CalculateEntity b = new CalculateEntity(456); |
| return calculateInterface.compare(a, b); |
| } |
| } |
| |
| class CalculateEntity { |
| private Integer num; |
| |
| public CalculateEntity(Integer num) { |
| this.num = num; |
| } |
| |
| |
| |
| |
| public Boolean equals(CalculateEntity entity) { |
| return this.num.equals(entity.num); |
| } |
| } |
| |
| @FunctionalInterface |
| interface CalculateInterface { |
| |
| |
| |
| Boolean compare(CalculateEntity a, CalculateEntity b); |
| } |
| |
2.4 类名::new
函数式接口抽象方法的形参列表与类的构造方法的一致,且抽象方法返回的类型是该类名的类型;
| public class MethodReferencesTest { |
| |
| public static void main(String[] args) { |
| |
| CalculateEntity r1 = MethodReferencesTest.getResult(num -> new CalculateEntity(num)); |
| System.out.println("r1:" + r1); |
| |
| CalculateEntity r2 = MethodReferencesTest.getResult(CalculateEntity::new); |
| System.out.println("r2:" + r2); |
| } |
| |
| public static CalculateEntity getResult(CalculateInterface calculateInterface) { |
| return calculateInterface.generateEntity(123); |
| } |
| } |
| |
| class CalculateEntity { |
| |
| private Integer num; |
| |
| |
| |
| |
| public CalculateEntity(Integer num) { |
| this.num = num; |
| } |
| |
| @Override |
| public String toString() { |
| return "num = " + num; |
| } |
| } |
| |
| @FunctionalInterface |
| interface CalculateInterface { |
| |
| |
| |
| CalculateEntity generateEntity(Integer num); |
| } |
| |
| // 运行结果 |
| r1:num = 123 |
| r2:num = 123 |
2.5 类名[]::new
函数式接口抽象方法的参数是int类型或者Integer类型,表示数组长度,抽象方法的返回值类型是该类名类型的数组;
| public class MethodReferencesTest { |
| |
| public static void main(String[] args) { |
| |
| CalculateEntity[] r1 = MethodReferencesTest.getResult(length -> new CalculateEntity[length]); |
| System.out.println("r1:" + Arrays.toString(r1)); |
| |
| CalculateEntity[] r2 = MethodReferencesTest.getResult(CalculateEntity[]::new); |
| System.out.println("r2:" + Arrays.toString(r2)); |
| } |
| |
| public static CalculateEntity[] getResult(CalculateInterface calculateInterface) { |
| return calculateInterface.generateEntityArr(5); |
| } |
| } |
| |
| class CalculateEntity { |
| |
| private int num; |
| |
| @Override |
| public String toString() { |
| return "num = " + num; |
| } |
| } |
| |
| @FunctionalInterface |
| interface CalculateInterface { |
| |
| |
| |
| CalculateEntity[] generateEntityArr(Integer length); |
| } |
| |
| // 运行结果 |
| r1:[null, null, null, null, null] |
| r2:[null, null, null, null, null] |
来源:https://blog.csdn.net/gu19930914/article/details/115705383
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)