我们如何在 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
,编译器会处理。
首先我们必须在其他文件或同一个文件中为 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
,编译器会处理。