这个lambda

时间:2015-10-08 21:43:11

标签: java lambda java-8

采取这段简单的代码

new Thread(() -> {

}).start();

我知道它有效,但我如何编写自己的类以允许某人以同样的方式使用它?

2 个答案:

答案 0 :(得分:3)

Lambda适用于Functional Interfaces,因此如果您的类或方法能够将此类接口作为参数,那么您可以使用您的类/方法。

new Thread(() -> {

}).start();

此代码有效,因为Thread有一个重载的构造函数,它将函数接口Runnable作为参数。

示例:如何编写自己的类

这里DoWork是我们的功能界面,只有抽象方法doit

public interface DoWork {
    public  void doit(String str);
}

让我们有一个名为MyClass的类,其构造函数将DoWork作为参数,并有一个方法startWork来启动工作(普通方法)。

public class MyClass {
    DoWork dw;
    public MyClass(DoWork dw) {
        this.dw = dw;
    }
    public void startWork(String s){
        dw.doit(s);
    }

}

就是这样,我们可以在Main

中测试它
class Main {

    public static void main(String[] args) {

        new MyClass(str -> System.out.println(str)).startWork("Hello print it!!!");
    }

}

我们也可以使用lambda和带参数的方法参数。

class Main {

    public static void main(String[] args) {

        test(str ->System.out.println(str), "Hello world!!!");

    }

    public static void test(DoWork d, String str) {
        d.doit(str);
    }

}

有关Lambda的更多信息,您可以看到http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html

答案 1 :(得分:1)

这是完整的代码:

new Thread(new Runnable() {
    @Override
    public void run() {
         //do things
    }
}).start();

Lambda表达式允许您更紧凑地表达单方法类的实例。

https://stackoverflow.com/users/5221149/andreas注意到内心存在差异:

  

匿名类声明仍然会创建一个单独的匿名类,而lambda添加一个隐藏方法并使用invokedynamic,基本上使用方法引用,因此场景背后存在差异。但在功能上它们是等价的。