可以简单点 2023-03-04 12:49 采纳率: 80%
浏览 83
已结题

java 使用函数式接口的疑问

java 使用函数式接口的疑问
为什么第一个第一次调用functionTest方法时提示Non-static method cannot be referenced from a static context
为什么不能这么使用,第二次调用functionTest方法为什么没有报错,有没有大概详细解释一下,这一块不太懂。。
以下是全部代码

public class FunctionTest1 {
    public static void main(String[] args) {
        List<UserInfo> userInfoList = getUserList();
        userInfoList.forEach(obj -> {
            //提示Non-static method cannot be referenced from a static context
            functionTest(obj, UserInfo::setNameDescTest);
            //不报错
            functionTest(obj, obj::setNameDescTest);
            //不报错
            functionTest1(obj, UserInfo::getNameDesc);
        });
    }
    
    public static void functionTest(UserInfo userInfo, Function<String, Boolean> function) {
        Boolean apply = function.apply(userInfo.toString());
        System.out.println(apply);
    }
    public static void functionTest1(UserInfo userInfo, Function<UserInfo, String> function) {
        String apply = function.apply(userInfo);
        System.out.println(apply);
    }
    
    public static List<UserInfo> getUserList() {
        List<UserInfo> userInfoList = new ArrayList<>();
        UserInfo userInfo = new UserInfo();
        UserInfo userInfo1 = new UserInfo();
        userInfoList.add(userInfo);
        userInfoList.add(userInfo1);
        return  userInfoList;
    }
}



public class UserInfo {
    private int age;
    private String name;
    private Double money;
    private String nameDesc;

    public UserInfo() {
    }

    public UserInfo(int age, String name, Double money) {
        this.age = age;
        this.name = name;
        this.money = money;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", money=" + money +
                ", nameDesc='" + nameDesc + '\'' +
                '}';
    }

    public  int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }
    public static void testStatic() {
        System.out.println("testStatic....");
    }

    public String getNameDesc() {
        this.name = "545tr";
        return nameDesc;
    }
    public boolean setNameDescTest(String nameDesc) {
        //this.nameDesc = nameDesc;
        System.out.println(nameDesc);
        return true;
    }

    public void setNameDesc(String nameDesc) {
        this.nameDesc = nameDesc;
    }
}

  • 写回答

9条回答 默认 最新

  • 「已注销」 2023-03-04 18:15
    关注

    “Devil组”引证GPT后的撰写:

    • 首先,函数式接口是指只有一个抽象方法的接口,可以用 lambda 表达式或方法引用来实现该接口。在 Java 8 中,引入了许多新的函数式接口来支持 Lambda 表达式和方法引用。
    • 对于你的第一个问题,当你在 main 方法中调用 functionTest 时,你传递了一个实例方法引用 UserInfo::setNameDescTest。由于该方法不是静态方法,所以不能从静态上下文中引用它,这就是为什么你得到了“Non-static method cannot be referenced from a static context”错误。
    • 但是,当你在第二次调用 functionTest 时,你传递了一个对 obj 实例的方法引用 obj::setNameDescTest。此时,实例方法 setNameDescTest 能够正确地从实例上下文中引用,因为它是针对实例对象调用的。
    • 对于你的第二个问题,你调用 functionTest1 方法时使用了一个函数式接口 Function<UserInfo, String>,该接口的方法签名为 apply(UserInfo),因此你可以传递一个接受 UserInfo 对象并返回 String 值的方法引用,如 UserInfo::getNameDesc。在这种情况下,因为 getNameDesc 是实例方法,它能够正确地从实例上下文中引用。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 3月12日
  • 已采纳回答 3月4日
  • 修改了问题 3月4日
  • 创建了问题 3月4日

悬赏问题

  • ¥15 MAC安装佳能LBP2900驱动的网盘提取码
  • ¥400 微信停车小程序谁懂的来
  • ¥15 ATAC测序到底用什么peak文件做Diffbind差异分析
  • ¥15 安装ubantu过程中第一个vfat 文件挂载失败
  • ¥20 GZ::CTF如何兼容一些靶机?
  • ¥15 etcd集群部署问题
  • ¥20 谁可以帮我一下问一下各位
  • ¥15 为何重叠加权后love图的SMD与svyCreateTableOne函数绘制基线表的不一致
  • ¥150 求 《小魔指》街机游戏机整合模拟软件
  • ¥20 你好,我想问下easyExcel下拉多选,或者复选框可以实现吗