【问题标题】:What's is the functionality of ()-> in collection.add(()->7); [duplicate]collection.add(()->7); 中 ()-> 的功能是什么? [复制]
【发布时间】:2020-01-29 16:09:55
【问题描述】:

我知道这将是今天 Stackoverflow 上的蹩脚问题......但我仍然想在 java 中找到以下 sn-p 的功能

理想情况下,我们应该将'Scoreable scoreable' 对象传递给collection.add,但是这个()->5 是什么?以及它如何将 int 值转换为 Scoreable 类型

public class ScoreCollectionTest {

    public void addTwoNumbersForMean() {

        ScoreCollection collection = new ScoreCollection();

        collection.add(()->5);
        collection.add(()->7);

    }

}
public class ScoreCollection {

    private List<Scoreable> scores = new ArrayList<>();

    public void add(Scoreable scoreable) {
        scores.add(scoreable);
    }

    public int arithmeticMean() {
        int total = scores.stream().mapToInt(Scoreable::getScore).sum();
        return total / scores.size();
    }
}

这里是Scoreable接口

public interface Scoreable { 
    int getScore(); 
} 

【问题讨论】:

标签: java lambda


【解决方案1】:

collection.add(()-&gt;5); 是语法糖:

collection.add(new Scoreable() {

  @Override
  int getScore() {
    return 5;
  }
});

由于 Scoreable 只有一种方法,因此它符合@FunctionalInterface 的条件,并且可以在 lambda 表达式中使用而不是匿名类

【讨论】:

  • Pedantry:它不符合@FunctionalInterface 的条件。这意味着它在物理上具有注解——注解实际上只是一些元数据——“编译器会将满足功能接口定义的任何接口视为功能接口,无论是否有 FunctionalInterface 注释存在”。正确的说法是“它有资格作为一个功能接口”。
  • 好吧,我不会称之为语法糖。确实效果是一样的,但是 lambda 表达式的语义有点不同。例如,lambda 表达式适用于封闭范围。
  • 答案有点不对。 lambda 不会被编译成匿名类。从逻辑上讲,它达到了相同的结果,但机制不同。 logicbig.com/tutorials/core-java-tutorial/java-8-enhancements/…
【解决方案2】:

不知道 Scoreable 是什么,我假设它是一个带有一个方法的接口(方法的名称无关紧要),它不接受任何参数并返回一个整数。

编译器将其解释为函数式接口(因为它满足函数式接口的所有要求),()-&gt;5 是始终返回 5 的无参数方法的 lambda 表达式。

【讨论】:

  • ``` public interface Scoreable { int getScore(); } ```
猜你喜欢
  • 2013-01-02
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
相关资源
最近更新 更多