gpt4 book ai didi

java - 理解方法引用工作的问题

转载 作者:行者123 更新时间:2023-12-04 07:30:45 26 4
gpt4 key购买 nike

我试图了解方法引用的工作原理:
注意:我确实通过了链接 :: (double colon) operator in Java 8以及其他相关文章。
我正在尝试使用方法引用调用 addMoney() 方法。 Add money 是一个实例方法,它不接受任何参数,但返回一个 Money 对象。对于这种情况,我们可以使用供应商,它具有

<R> get() 
它不接受任何参数并返回类型。
    Money money = new Money(2);
Supplier<Money> supplier = money::addMoney;
这按预期工作。
但是当我以类似的方式给予时它也有效,不知道为什么以及如何:
    Function<Money, Money> addingMoney = Money::addMoney;
Consumer<Money> returnMoney = Money::addMoney;
这对我来说根本没有意义,因为 addMoney 方法是实例方法,我们使用类名访问它,而且为了方法引用工作,即使这里没有发生这种情况,参数也必须匹配。你可以请人指导。
对于下面的类(class),我可以写一个
class Money{
private int moneyValue =0;

public Money(int i) {
// TODO Auto-generated constructor stub
}

public Money addMoney(){
this.moneyValue+=10;
System.out.println("We are adding money");
return this;
}

public Money spendMoney(){
System.out.println("We are deducting money");
this.moneyValue-=10;
return this;
}

public int getMoneyValue() {
return this.moneyValue;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return this.moneyValue+"";
}

}

最佳答案

当从类中调用方法引用但它是一个实例方法时:它需要一个实例才能工作。
这就是为什么Function<Money, Money> addingMoney = Money::addMoney;作品

  • 喜欢 Supplier ,它返回一个 Money实例(第二个泛型)
  • 因为它是一个实例方法,所以它需要一个 Money实例作为输入(第一种泛型)

  • 这就是为什么 Consumer<Money> returnMoney = Money::addMoney;作品
  • 它就像 Function 的一半,它将实例作为输入
  • 但你说你不在乎结果

  • 那么 lambda 等价物可能会帮助你
    // no input but care about output
    Supplier<Money> supplier = money::addMoney;
    Supplier<Money> supplier = () -> money.addMoney();

    // care about output and needs input
    Function<Money, Money> addingMoney = Money::addMoney;
    Function<Money, Money> addingMoney = money1 -> money1.addMoney();

    // don't care about output but needs input
    Consumer<Money> returnMoney = Money::addMoney;
    Consumer<Money> returnMoney = money1 -> money1.addMoney();

    关于java - 理解方法引用工作的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67948042/

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