这个方法引用如何有效?

bvpmtnay  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(349)

这个问题在这里已经有答案了

示例方法参考和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));

xfyts7mz

xfyts7mz1#

嗯,好吧,在这儿行得通!我不确定这里是否还藏着什么东西。

import java.util.List;

import static java.util.stream.Collectors.summingInt;

import java.util.Arrays;

class Dish {

    public int getCalories() {
        return calories;
    }

    public static final List 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)
    );

    public static void main(String[] args) {
        int totalCalories = menu.stream().collect(summingInt(Dish::getCalories));
        System.out.println(totalCalories);
    }

    String name;

    int calories;

    Dish.Type type;

    public Dish(String name, boolean b, int calories, Dish.Type type) {
        super();
        this.name = name;
        this.calories = calories;
        this.type = type;
    }

    enum Type {
        MEAT, FISH, OTHER
    }

}
uhry853o

uhry853o2#

任何想知道它为什么起作用的人。它起作用是因为 this 是对象的每个方法的隐式第一个参数。因此 Dish::getCalories 与相同 applyAsIntToIntFunction . 如果我错了,请纠正我。

ipakzgxi

ipakzgxi3#

我这么问是因为 getCalories 与的签名不匹配 applyAsInt 抽象方法 ToIntFunction .
事实上,它确实匹配。 ToIntFunction<T> 是一个函数接口,因为它有注解 @FunctionalInterface . 也就是说 applyAsInt 匹配提供从Map的方法的任何class1、方法引用或lambda <T>int .
在这种情况下 Dish::getCalories 正在Map Dish 到一个 int 打电话给 Dish 示例的 getCalories() 方法:
Map的源是的示例 Dish Map的结果是调用 getCalories() 在示例2上。
(注:这是一个直观的解释。有关技术说明,请参阅jls的相关部分。)
1-在提供类示例的情况下,类api中只能有一个方法满足功能接口要求。所以,假设,如果 Dish@ToIntFunction<Dish> 注解时,它无法公开两个不带参数并返回 int .
2-应用常规方法重写规则。如果实际对象是 Dish ,它超越了 getCalories() ,则Map将调用该方法,而不是重写的方法。

相关问题