这个问题在这里已经有答案了:
示例方法参考和lambda参数(2个答案)
Java8:方法引用绑定接收器和未绑定接收器之间的差异(6个答案)
Java8:不理解java实现功能接口的方式(3个答案)
在Java8中,“特定类型的任意对象”是什么意思(5个答案)
java8中不同参数方法的引用(1个答案)
5个月前关门了。
class Dish {
public int getCalories() {
return calories;
}
public static final List<Dish> menu = Arrays.asList(
new Dish("pork", false, 800, Dish.Type.MEAT),
new Dish("beef", false, 700, Dish.Type.MEAT),
new Dish("chicken", false, 400, Dish.Type.MEAT),
new Dish("french fries", true, 530, Dish.Type.OTHER),
new Dish("rice", true, 350, Dish.Type.OTHER),
new Dish("season fruit", true, 120, Dish.Type.OTHER),
new Dish("pizza", true, 550, Dish.Type.OTHER),
new Dish("prawns", false, 400, Dish.Type.FISH),
new Dish("salmon", false, 450, Dish.Type.FISH)
);
}
以下内容如何 Dish::getCalories
方法引用在以下情况下有效 summingInt
需要 ToIntFunction
? 我这么问是因为 getcalories
与的签名不匹配 applyAsInt
抽象方法 ToIntFunction
```
int totalCalories = menu.stream().collect(summingInt(Dish::getCalories));
3条答案
按热度按时间xfyts7mz1#
嗯,好吧,在这儿行得通!我不确定这里是否还藏着什么东西。
uhry853o2#
任何想知道它为什么起作用的人。它起作用是因为
this
是对象的每个方法的隐式第一个参数。因此Dish::getCalories
与相同applyAsInt
的ToIntFunction
. 如果我错了,请纠正我。ipakzgxi3#
我这么问是因为
getCalories
与的签名不匹配applyAsInt
抽象方法ToIntFunction
.事实上,它确实匹配。
ToIntFunction<T>
是一个函数接口,因为它有注解@FunctionalInterface
. 也就是说applyAsInt
匹配提供从Map的方法的任何class1、方法引用或lambda<T>
至int
.在这种情况下
Dish::getCalories
正在MapDish
到一个int
打电话给Dish
示例的getCalories()
方法:Map的源是的示例
Dish
Map的结果是调用getCalories()
在示例2上。(注:这是一个直观的解释。有关技术说明,请参阅jls的相关部分。)
1-在提供类示例的情况下,类api中只能有一个方法满足功能接口要求。所以,假设,如果
Dish
与@ToIntFunction<Dish>
注解时,它无法公开两个不带参数并返回int
.2-应用常规方法重写规则。如果实际对象是
Dish
,它超越了getCalories()
,则Map将调用该方法,而不是重写的方法。