拉姆达表达式必须在方法中吗?它们是否可以作为类的成员存在于方法之外

Sri*_*ini 3 java lambda

我试图看到,在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)

Dea*_*ool 6

您可以在类中的任何位置声明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)