我们如何在 Lambda 表达式中实现它?

How can we make it in Lambda expression?

首先我们必须在其他文件或同一个文件中为 lambda 声明接口 expression.But 如果我们可以在方法声明中做到这一点那将更多 easier.is 无论如何?

 public class LambdaAppJava8 {
 public int fonk(
     int a, 
     int b, 
     interface MyInterface{
          public int call(int a, int b);
     } anonim
 ) {
    return anonim.call(a, b);
 }

 public static void main(String[] args) {
    LambdaAppJava8 app = new LambdaAppJava8();
    System.out.println(app.fonk(1, 3, (c, d) -> c + d));
 }
}

不,在 java 中无法做到这一点,您不能在方法减速中声明匿名 class/interface。

如果您正在为该特定场景寻找解决方案,那么我建议:

public int fonk(
     int a, 
     int b, 
     BiFunction<Integer, Integer, Integer> anonim
 ) {
    return anonim.apply(a, b);
 }

根据:BiFunction

你可以做到

import java.util.function.BiFunction;


public class LambdaAppJava8 {
    public static int fonk(int a, int b,int c,
             BiFunction<Integer,Integer,Integer> func
         ) {
            return func.apply(func.apply(a, b),c);
         }
    public static void main(String[] arg){
        int sum = fonk(1,2,3,(x,y)->x+y);
        int product = fonk(1,2,3,(x,y)->x*y);
        System.out.println(sum);
        System.out.println(product);
    }
}

无法在方法声明中声明接口,但您可以将其设为足够接近的嵌套类型。

public class LambdaAppJava8 {
    private interface MyInterface {
        public int call(int a, int b);
    }
    public int fonk(int a, int b, MyInterface anonim) {
        return anonim.call(a, b);
    }
    public static void main(String[] args) {
        LambdaAppJava8 app = new LambdaAppJava8();
        System.out.println(app.fonk(1, 3, (c, d) -> c + d));
    }
}

匿名的含义似乎也存在误区interface。您可以在方法内声明匿名 classes,但这些不是“即时”声明的;它们仍然是在编译时创建的类型,具有自己的 class 文件,该文件不小于顶级类型,实际上,恰恰相反。此类类型比顶级类型具有 更大 class 文件,因为它们包含有关定义它们的周围上下文的元信息。

如果有办法在方法的参数列表中声明 interface,那也不会改变;它不会比在其他任何地方声明它更有效。但它需要特殊的范围规则例外,因为在正常的范围规则下,你不能调用一个方法,该方法需要一个方法本地类型的参数,因为调用者不知道该类型。


但请注意,上面的示例实际上是您想要实现的。您还可以将 MyInterface 的声明更改为 public,其他 classes 可以使用 lambda 表达式调用该方法,就像用例 app.fonk(1, 3, (c, d) -> c + d) without需要导入MyInterface。您的问题似乎是关于什么的,调用者不必处理专门为 fonk 参数定义的 interface,编译器会处理。