理解方法引用工作的问题
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();
我正在尝试了解方法参考的工作原理: 注意:我确实浏览了 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();