理解方法引用工作的问题

Issue in understanding the working of Method Referencing

我正在尝试了解方法参考的工作原理: 注意:我确实浏览了 link :: (double colon) operator in Java 8 和其他相关文章。

我正在尝试使用方法引用来调用 addMoney() 方法。 Add money 是一个实例方法,它不接受任何参数,但 returns 一个 Money 对象。对于这种情况,我们可以使用具有

的供应商
<R> get() 

它不接受参数和 returns 类型。

    Money money = new Money(2);
    Supplier<Money> supplier = money::addMoney;

这按预期工作。

但是当我以类似的方式给予时它也有效,不知道为什么以及如何:

    Function<Money, Money> addingMoney = Money::addMoney;
    Consumer<Money> returnMoney = Money::addMoney;

这对我来说根本没有意义,因为 addMoney 方法是实例方法,我们正在使用 Class Name 访问它,而且为了使方法引用起作用,参数必须匹配,即使这里没有发生这种情况。有没有人可以指导一下。

下面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+"";
    }
    
}

当从 class 调用方法引用但它是一个实例方法时:它需要一个实例才能工作。

这就是 Function<Money, Money> addingMoney = Money::addMoney; 有效的原因

  • Supplier 一样,它 returns 一个 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();