我试图看到,在Scala和Java之间传递函数作为参数的区别.几年前我已经转移到了Scala,与Java没有多少联系.我可以在方法之外使用Lambda表达式,如下所示吗?它编译和工作正常,但它有什么不对.到目前为止,我见过的所有例子都将Lamdas放在一个方法中.以下代码只是一个示例,我知道您可以使用Supplier Interface实现相同的功能.
@FunctionalInterface
public interface IFunc {
String printMessage();
}
public class JavaFunc {
public String message() {
return functionA(functionB);
}
IFunc functionB = () -> "Hi, I am functionB from Java, I am passed to functionA as a parameter.";
public String functionA(IFunc funcB) {
return funcB.printMessage();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在类中的任何位置声明lambda表达式
如果在方法内部声明(类似于局部变量,方法内部的范围)
public String message() {
IFunc functionB = () -> "Hi, I am functionB from Java, I am passed to functionA as a parameter.";
return functionA(functionB);
}
Run Code Online (Sandbox Code Playgroud)
如果在类中声明(类似于可以直接在所有实例方法中访问的实例变量,并且在静态区域中使用对象引用)
public class JavaFunc {
IFunc functionB = () -> "Hi, I am functionB from Java, I am passed to functionA as a parameter.";
public String message() {
// use here functionB
return functionA(functionB);
}
Run Code Online (Sandbox Code Playgroud)
示例: lambda表达式Predicate和匿名内部类
p1,p2是实例级别,p3,p4是本地的
public class DemoMain {
Predicate<Integer> p1 = i -> i > 5;
Predicate<Integer> p2 = new Predicate<Integer>() {
@Override
public boolean test(Integer t) {
// TODO Auto-generated method stub
return false;
}
};
public static void main(String args[]) {
DemoMain m = new DemoMain();
System.out.println(m.p1.test(10));
System.out.println(m.p2.test(10));
}
public void m1() {
System.out.println(p1.test(10));
System.out.println(p2.test(10));
Predicate<Integer> p3 = i -> i > 5;
Predicate<Integer> p4 = new Predicate<Integer>() {
@Override
public boolean test(Integer t) {
// TODO Auto-generated method stub
return false;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)