Java中Setter与Getter的方法引用解析求助
Java方法引用与函数式接口对应关系解析
代码示例
POJO类
package com.lambda.jay; public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
对象初始化类
package com.fi.lambda.jay; import java.util.function.BiConsumer; import java.util.function.Function; public class Actor { public <T,R> void printField(T obj, Function<? super T,? extends R> getter1) { System.out.println(getter1.apply(obj).toString()); } public <T,R> void setField(T obj, R value, BiConsumer<T, R> setter) { setter.accept(obj, value); } public static void main(String[] args) { Person person = new Person(); Actor actor = new Actor(); actor.setField(person, "Bob", Person::setName);// (a,b) -> a.setB(b); actor.printField(person, Person::getName); } }
问题与解析
1. Setter方法引用与BiConsumer的对应关系
BiConsumer<T, R>的核心定义是接收两个输入参数、执行无返回值操作,它的抽象方法为void accept(T t, R r)。
Person::setName属于实例方法的方法引用,它的适配逻辑是:将方法引用绑定的第一个参数作为调用该实例方法的对象,第二个参数作为实例方法的入参。
对应Lambda表达式(personObject, nameValue) -> personObject.setName(nameValue)来看:
- Lambda的第一个参数
personObject对应BiConsumer的泛型T(此处为Person类型),是调用setName的实例对象; - Lambda的第二个参数
nameValue对应BiConsumer的泛型R(此处为String类型),是setName方法的入参; - Lambda体的执行逻辑完全匹配
BiConsumer.accept的行为:接收两个参数,执行无返回值的赋值操作。
Java编译器会自动完成这种适配,因为两者的参数数量、类型以及无返回值的特性完全匹配。
2. Getter方法引用与Function的对应关系
Function<T, R>的核心定义是接收一个输入参数、返回对应结果,它的抽象方法为R apply(T t)。
Person::getName同样是实例方法的方法引用,适配逻辑为:将方法引用绑定的唯一参数作为调用该实例方法的对象,方法的返回值作为Function的输出结果。
对应Lambda表达式(personObject) -> personObject.getName()来看:
- Lambda的唯一参数
personObject对应Function的输入泛型T(此处为Person类型),是调用getName的实例对象; - Lambda的返回值对应
Function的输出泛型R(此处为String类型),和getName方法的返回类型完全一致; - Lambda的执行逻辑完全匹配
Function.apply的行为:接收一个参数,返回对应结果。
编译器会自动将Person::getName适配为Function<Person, String>类型,因为参数数量、类型以及返回值的匹配关系完全符合Function的定义。
内容的提问来源于stack exchange,提问作者Jaya
相关产品推荐
相关产品推荐

