当前位置: 首页 > 知识库问答 >
问题:

此方法引用如何有效?[复制]

壤驷棋
2023-03-14
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)
  );
}

当汇总需要一个ToIntFunction时,以下方法引用如何有效?我这样问是因为GetCarries的签名与applyAsInt的签名不匹配

int totalCalories = menu.stream().collect(summingInt(Dish::getCalories));

共有3个答案

公冶高义
2023-03-14

嗯,嗯,它在这里工作!我不确定这里是否还有隐藏的东西。

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
    }

}
法弘壮
2023-03-14

对于任何想知道它为什么有效的人。它之所以有效,是因为它是对象的每个方法的隐式第一个参数。因此,Dish::GetCarries的签名与ToIntFunction的applyAsInt相同。如果我错了,请纠正我。

孙海
2023-03-14

我这样问是因为GetCarries的签名与ToIntFunction的抽象方法applyAsInt的签名不匹配。

事实上,它确实匹配。

<代码>ToIntFunction

在这种情况下,Dish::getCalories通过调用Dish实例getCalories()方法将Dish映射到int

  • 映射的源是Dish的实例

(注意:这是一个直观的解释。有关技术解释,请参阅JLS的相关部分。)

在提供类实例的情况下,类API中只能有一个方法满足功能接口要求。因此,假设,如果用ToIntFunction声明Dish

2-正常方法覆盖规则适用。如果实际对象是Dish的子类型的实例,并且它重写了getCarries(),那么映射将调用该方法,而不是重写的方法

 类似资料:
  • 在此代码中,我有以下警告: 用方法引用替换此lambda。 我不知道如何解决这个错误,因为它在forEach中,在map中,我可以使用,但在这里,我不能。 有什么想法吗?

  • 我有一个使用函数引用的类: 在典型运行期间,此函数将被称为108次。 类进入库,函数由库的用户定义。所以我不能在类中定义函数。 我读过这个: ()缺点是在被调用时引入一些(非常小的)开销(因此在性能非常关键的情况下,这可能是一个问题,但在大多数情况下不应该) 有没有更有效的方法将函数< code>u传递给类< code>equation?这算不算“性能非常关键的情况”? 编辑 似乎有点混乱。为了清

  • 我有一个包含错误列表的集合。我想通过一个键(UUID UserId)对它们进行分组。为此,我从以下答案中复制了代码:https://stackoverflow.com/a/30202075/4045364 Sonar Lint告诉我以下错误: 用方法引用替换此lambda<代码>- 我所尝试的: 基于这些问题:SONAR:用方法引用替换此lambda,可运行接口:用方法引用替换此lambda。(未

  • 当我在sonar中检查时,结果是: 它实际上指的是: 我的代码如下所示: 我试图改变它,但我得到了一个错误。有人知道如何改变它吗?

  • 索纳尔曲贝的解释是: 方法/构造函数引用比使用lambdas更紧凑、更易读,因此是首选。