采取这段简单的代码
new Thread(() -> {
}).start();
我知道它有效,但我如何编写自己的类以允许某人以同样的方式使用它?
答案 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,基本上使用方法引用,因此场景背后存在差异。但在功能上它们是等价的。