gpt4 book ai didi

java - 引用特定对象的实例方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:02 26 4
gpt4 key购买 nike

在下面的代码中,用类名传递方法引用变量时有效,但是用用户对象传递引用变量时出错。

public class User {
private String name;

public User(String name) {
this.name = name;
}

public void printName() {
System.out.println(name);
}
}


public class Main {
public static void main(String[] args) {
User u1 = new User("AAA");
User u2 = new User("BBB");
User u3 = new User("ZZZ");

List<User> userList = Arrays.asList(u1, u2, u3);

userList.forEach(User::printName); // works
userList.forEach(u1::printName); // compile error
}
}

最佳答案

userList.forEach期待一个 Consumer<? extends User> - 换句话说,一种接受 User 的方法引用并用它做点什么。

那可能是:

  • 接受 User 的静态方法参数,在这种情况下,参数将在每次迭代时用列表中的相关元素填充:

    staticMethod(userFromList)
  • 一个实例方法(任何类)接受 User参数,提供了一个特定实例来调用它 - 同样,参数将填充相关元素:

    target.instanceMethod(userFromList)
  • User 上的实例方法没有参数,没有特定实例,在这种情况下,方法调用的目标将是每次迭代列表中的相关元素:

    userFromList.instanceMethod()

因为您尝试指定一个目标并且该方法没有任何参数,forEach方法对每个元素无能为力 - 它不能将它作为参数传递,因为该方法没有任何参数,它不能将它用作方法目标,因为你已经指定了一个。

您的工作代码显示了第三个示例。下面是另外两种方法,可让您演示前两种方法:

public class UserPrinter {
private final String name;

public UserPrinter(String name) {
this.name;
}

public static void staticPrintUser(User user) {
// Assuming you add a User.getName() method
System.out.println("staticPrintUser: " + user.getName());
}

public void instancePrintUser(User user) {
System.out.println("instancePrintUser (instance " + name + "): "
+ user.getName());
}
}

然后:

userList.forEach(UserPrinter::staticPrintUser);    // equivalent to
//userList.forEach(p -> UserPrinter.staticPrintUser(p));
UserPrinter printer = new UserPrinter("my printer");
userList.forEach(printer::instancePrintUser); // equivalent to
//userList.forEach(p -> printer.instancePrintUser(p));

如果你真的想调用printUser同样User三遍,忽略 User在列表中,您可以使用:

userList.forEach(ignored -> u1.printName());

关于java - 引用特定对象的实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25409533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com