如何使用函数参数调用指定getter,实现printDog灵活打印Dog类属性?
实现方案
1. printDog方法的参数类型定义
你使用dog::getName、dog::getBreed作为方法引用传参时,这两个方法的共同特征是无入参、返回字符串类型,完全匹配JDK内置的java.util.function.Supplier<String>函数式接口的签名:
Supplier<T>的抽象方法为T get(),和两个getter的方法定义没有任何签名冲突,不需要额外自定义接口就能直接接住两种方法引用的传参- 这种定义方式把“选择打印哪个属性”的逻辑完全交给调用方,方法内部不需要写任何分支判断。
2. printDog方法的内部调用逻辑
拿到传入的Supplier<String>类型参数后,只需要调用参数的get()方法,就能触发对应getter的执行、拿到属性值,直接完成打印即可。
3. 完整可运行示例
import java.util.function.Supplier; // 已实现的Dog类 class Dog { private String name; private String breed; public Dog(String name, String breed) { this.name = name; this.breed = breed; } public String getName() { return name; } public String getBreed() { return breed; } } public class Demo { // 定义printDog方法 public static void printDog(Supplier<String> propertyGetter) { // 调用传入的getter获取属性值并打印 String value = propertyGetter.get(); System.out.println("打印Dog属性:" + value); } public static void main(String[] args) { Dog dog = new Dog("豆豆", "柯基"); // 按你计划的方法引用形式调用 printDog(dog::getName); printDog(dog::getBreed); } }
适配扩展:如果后续需要打印其他类型的属性(比如int类型的age),只需要将参数泛型调整为对应类型即可,printDog的核心逻辑不需要改动。
内容的提问来源于stack exchange,提问作者parsecer
相关产品推荐
相关产品推荐

