Lambda表达式其实本质就是匿名内部类
Lambda表达式只能用在函数式接口上
函数式接口条件:
1、必须是一个接口
2、接口中必须只有一个抽象方法
Lambda标准语法
(参数类型 参数名称) ‐> { 代码语句 }
Lambda表达式 VS 匿名内部类 VS 实现接口
使用多线程的Runnable接口做实验;Runnable接口就是一个函数式接口,里面就一个run方法
// Runnable源码
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
1、实现接口
// 接口的实现类
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程启动了!");
}
}
// main方法
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start();
}
2、匿名内部类
public static void main(String[] args) {
// 匿名内部类
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程启动了!");
}
});
t1.setName("t1");
t1.start();
}
3、Lambda表达式
public static void main(String[] args) {
// Lambda表达式
Thread t2 = new Thread(() -> {
System.out.println("线程启动了!");
});
t2.start();
//---------------------------------------------------------------------
// 这种更直观一点
Runnable r = () -> {System.out.println("线程启动了!");};
Thread t2 = new Thread(r);
t2.start();
}
注意
- 一行代码对于 lambda 说是理想的,三行代码是合理的最大值。 如果违反这一规定,可能会严重损害程序的可读性。 如果一个 lambda 很长或很难阅读,要么找到一种方法来简化它或重构你的程序来消除它。
- 简写:
1、方法中只有一个形参时,可以省略形参的括号
2、形参的数据类型可以省略
3、方法体中只有一行代码可以省略大括号{}
Temp temp = (Integer a) -> {System.out.println(a);};
// 上面的Lambda表达式可以简化:
Temp temp = a -> System.out.println(a);
双冒号(::)运算操作符
双冒号运算操作符是lambda表达式的一种简写。
使用lambda表达式会创建匿名函数, 但有时候需要使用一个lambda表达式只调用一个方法(不做其它), 所以这才有了双冒号运算操作符!
链接: https://zhuanlan.zhihu.com/p/266804576
知乎上面的一个帖子讲的就非常不错。