java 在一行中使用接口的Lambda表达式

46qrfjad  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(130)

我正在学习接口,我遇到了一个我不理解的问题,是关于lambda表达式的,我学过的,可以用在一行中,但是我创建了一个case,这个表达式不起作用,我不知道哪里出错了。
我已经定义了这个接口:

public interface MathOperations {
    int add(int a, int b);
}

接下来我定义了一个类,我想在这个类中用adder方法测试这个接口。

public class App {
    public static void main(String[] args) {
        int x;
        x = adder((a, b) -> return a+b);
    }

    public static int adder(MathOperations mo){
        return mo.add(3, 5);
    }
}

不幸的是,带有x赋值语句的那一行不起作用,我不知道哪里出错了。编译器无法识别return语句中的ab变量。我知道我可以用括号进行赋值,但我很好奇我是否可以在一行中完成。

pxy2qtax

pxy2qtax1#

@FunctionalInterface
interface MathOperations {
    int add(int a, int b);
}

这里有两种方法来做你想做的事情。

  • 要创建lambda,需要指定接口类型,并提供如何处理ab的定义。
  • 然后你就可以调用lambda并得到值。
MathOperations compute = (a,b)->a+b;
x = compute.add(2,3);
System.out.println(x);

以上所述在幕后基本上完成了以下工作。

  • 这里,anonymous class是使用接口定义的,并使用new关键字示例化(类包含实现的方法)。
  • 在Java 8中引入FuntionalInterfaces和lambdas的概念之前,实现该接口是标准的。
  • 然后调用adder方法,提供刚刚创建的示例mo使用之前创建的compute lambda调用该方法。
MathOperations mo =new MathOperations() {
                          public int add(int a,int b) {
                              return a+b;
                          }};

 System.out.println(adder(mo));
 System.out.println(adder(compute));

上述三个print语句的输出
一个三个三个一个

    • 注意:**但是,通过以下示例,可以从已定义的API functional interfaces创建一个更通用的接口。名称MathOperation很好,但add方法太具体(并且函数接口只能包含一个abstract method)。因此,不要使用add方法,而使用compute或类似方法,并让lambda的name指示其operation.
MathOperation add = (a,b)->a+b;
int sum = add.compute(10,20); // 30
MathOperation sub = (a,b)->a-b;
int diff = sub.compute(10,20) // -10

相关问题