之前写 Optional 这个类的时候,简单说了一下 Lambda 是怎么用的,这里再跟大家一起回顾一下,Lambda 的语法是这样的:
以 Lambda 语法创建线程和匿名内部类创建线程的区别
(显然代码少了很多!)
:
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("公众号:Java3y---关注我!");
}
});
new Thread(() -> System.out.println("公众号:Java3y---关注我!"));
}
使用 Lambda 表达式,实际就是创建出该接口的实例对象。
使用 Labmda 表达式需要函数式编程接口,比如在 Runnable 接口上我们可以看到 @FunctionalInterface 注解
(标记着这个接口只有一个抽象方法)
1.1 函数式编程接口
从上面的代码例子可以看出,我们使用 Lambda 表达式创建线程的时候,并不关心接口名,方法名,参数名。我们只关注他的参数类型,参数个数,返回值。
JDK 原生就给我们提供了一些函数式编程接口方便我们去使用,下面是一些常用的接口:
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y");
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s);
1.2 方法引用
在学 Lambda 的时候,还可能会发现一种比较奇怪的写法,例如下面的代码:
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");
Consumer consumer = s -> System.out.println(s);
consumer.accept("Java3y");
显然使用方法引用比普通的 Lambda 表达式又简洁了一些。
如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用
-
静态方法的方法引用
-
非静态方法的方法引用
-
构造函数的方法引用
public class Demo {
public static void main(String[] args) {
Consumer consumerStatic = Java3y::MyNameStatic;
consumerStatic.accept("3y---static");
Java3y java3y = new Java3y();
Consumer consumer = java3y::myName;
consumer.accept("3y---instance");
Supplier supplier = Java3y::new;
System.out.println(supplier.get());
}
}
class Java3y {
public static void MyNameStatic(String name) {
System.out.println(name);
}