【问题标题】:Java Lambdas Interfaces [duplicate]Java Lambdas接口[重复]
【发布时间】:2018-10-16 23:06:09
【问题描述】:

众所周知,我们工程师在晚上工作得最好 :) 昨天晚上在学习lambda,看到一段这样的代码,

    BirdCompare tester = new BirdCompare();
    MathOperation addition = (a, b) -> (a + b);
    MathOperation subtraction = (int a, int b) -> (a - b);
    MathOperation multiplication = (int a, int b) -> {
        return a * b;
    };
    MathOperation division = (a, b) -> a / b;

    interface MathOperation {
        int operation(int a, int b);
    }

示例只是将 lambda 表达式分配给 MathOperation 接口的变量,但如何? 它实现了接口中名为 operation 的方法,我感到困惑的是将该实现分配给接口的变量。我真的很想知道基于这种方法的想法。 提前谢谢大家。

【问题讨论】:

标签: java lambda java-8 functional-programming


【解决方案1】:

您可以将 lambda 表达式分配给一致的函数式接口类型,即参数类型和返回类型匹配。请参阅JLS, Section 15.27.3 了解详细信息,但本质上是:

如果T 是函数式接口类型(第 9.8 节)并且表达式是全等的,则 lambda 表达式与目标类型 T 的赋值上下文、调用上下文或转换上下文兼容> 具有从T 派生的地面目标类型的函数类型。

JLS, Section 9.8,定义了一个功能接口:

函数式接口是一个只有一个抽象方法的接口(除了Object的方法),因此代表一个单一的函数契约。

你的MathOperation 接口不是Java 内置的并不重要,它没有用@FunctionalInterface 注释也没关系。它有一个抽象方法,并且参数和返回类型匹配,所以符合条件。

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多