简介
Lambda 表达式,Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
语法
lambda 表达式的语法格式如下:
(parameters) ->{ statements; }
parameters 为方法参数(可以是无也可以是多个);statements 为方法实现内容;
编辑
使用Labmda表达式需要函数式编程接口,比如在Runnable接口上我们可以看到@FunctionalInterface
注解(标记着这个接口只有一个抽象方法) ,如果自己创建接口,也可以不用此注解,只要保证抽象方法只有一个即可!
编辑
代码示例
public class Test { public static void main(String[] args) { Runnable runnable=()-> System.out.println("洛阳泰山!how are you?"); runnable.run(); } }
控制台输出
编辑
代码示例
正常声明一个线程代码
// 用匿名内部类的方式来创建线程 new Thread(new Runnable() { @Override public void run() { System.out.println("我是洛阳泰山 记得关注我哦!"); } }).start();
用Lambda语法简化后
// 使用Lambda来创建线程 new Thread(() -> System.out.println("我是洛阳泰山 记得关注我哦!")).start();
Thread的构造器
编辑
由此可见 () -> System.out.println("我是洛阳泰山 记得关注我哦!") 等效与 Runnable target的实例。
函数式编程接口
从上面的代码例子可以看出,我们使用Lambda表达式创建线程的时候,并不关心接口名,方法名,参数名。我们只关注他的参数类型,参数个数,返回值。
JDK原生就给我们提供了一些函数式编程接口方便我们去使用,下面是一些常用的接口:
名称 | 接口 | 说明 |
一般函数 | Function |
一元函数,抽象apply方法 |
算子函数(输入输出同类型) | UnaryOperator |
一元算子,抽象apply方法 |
谓词函数(输出boolean) | Predicate |
一元谓词,抽象test方法 |
消费者(无返回值) | Consumer |
一元消费者函数,抽象accept方法 |
供应者(无参数只有返回值) | Supplier |
无元供应者函数,抽象get方法 |
简单说明一下:
- 无元表示无参数,一元表示只有一个入参,二元表示有两个入参。
二元接口示例
编辑
编辑
代码示例
Function和 Consumer 的使用示例可以参考之前的文章
import java.util.function.*; public class Test { public static void main(String args[]){ // Supplier 无入参,有返回值 Supplier<String> supplier = () -> "洛阳泰山"; String s = supplier.get(); System.out.println(s); } }
使用Lambda时,要记住的就两点:
- Lambda返回的是接口的实例对象
- 有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么---->选择自己合适的函数式接口
方法引用
在学Lambda的时候,还可能会发现一种比较奇怪的写法,例如下面的代码:
// 方法引用写法 Consumer<String> consumer = System.out::println; consumer.accept("洛阳泰山");
和下面代码等效
// 普通的Lambda写法 Consumer<String> consumer = s -> System.out.println(s); consumer.accept("洛阳泰山");
System.out::println 相当于调用了PrintStream类 (System.out)的println方法
编辑
方法引用又分了几种:
- 静态方法的方法引用
- 非静态方法的方法引用
- 构造函数的方法引用
代码示例
import java.util.function.*; public class Test { public static void main(String args[]){ // 静态方法引用--通过类名调用 Consumer<String> consumerStatic = Test::say; consumerStatic.accept("输出静态方法!"); //实例方法引用--通过实例调用 Test test = new Test(); Consumer<String> consumer = test::eat; consumer.accept("输出实例方法!"); // 构造方法方法引用--无参数 Supplier<Test> supplier = Test::new; System.out.println(supplier.get()); } // 静态方法 public static void say(String name) { System.out.println(name); } // 实例方法 public void eat(String name) { System.out.println(name); } }
如果你想更深入的学习lambda的,可以研究下jdk lambda相关的源码是怎么写的,也可百度更多lambda相关的文章,也可持续关注我,后续更新lambda相关的文章知识内容!