Lambda 表達式
Lambda 表達式的實質屬於函數式編程。
語法格式為:(parameters) -> expression或(parameters) ->{statements; }
Lambda 表達式的特點
- Lambda 表達式只能引用標記了 final 的外層局部變量
- 不能在lambda 內部修改定義在域外的局部變量
- Lambda 表達式的局部變量可以不用聲明為 final,但是必須不可被后面的代碼修改(自帶 final)
- Lambda 表達式當中不允許聲明一個與局部變量同名的參數或者局部變量
Lambda 表達式的作用
- 避免匿名內部類定義過多
- 讓代碼更簡潔,只留下核心邏輯
函數式接口
函數式接口 Functional Interface,是只包含唯一一個抽象方法的接口。對於函數式接口,可以通過 Lambda 表達式來直接創建該接口的對象。如 Runnable 接口:
public interface Runnable {
public abstract void run();
}
使用 Lambda 表達式實現 Runnable
//常規寫法
new Thread(new Runnable(){
@Override
public void run(){
...
}
}).start();
//Lambda 表達式
new Thread( () -> {
...
}).start();
JDK 1.8之前已有的函數式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
JDK 1.8 新增加的函數接口:
- java.util.function
Lambda 表達式的簡化過程
實現類-->靜態內部類-->局部內部類-->匿名內部類-->Lambda 表達式
簡化過程如下:
實現類
public class TestLamda01 {
public static void main(String[] args) {
DoSports jog = new Jog();
}
}
interface DoSports{
void start();
}
//實現類
class Jog1 implements DoSports{
@Override
public void start() {
System.out.println("I'm jogging");
}
}
靜態內部類
public class TestLambda01 {
//靜態內部類
static class Jog implements DoSports{
public void start(){
System.out.println("I'm jogging");
}
}
public static void main(String[] args) {
DoSports jog = new Jog();
jog.start();
}
}
interface DoSports{
void start();
}
局部內部類
public class TestLambda01 {
public static void main(String[] args) {
//局部內部類
class Jog implements DoSports{
public void start(){
System.out.println("I'm jogging");
}
}
DoSports jog = new Jog();
jog.start();
}
}
interface DoSports{
void start();
}
匿名內部類
public class TestLambda01 {
public static void main(String[] args) {
DoSports jog = new DoSports(){
public void start(){
System.out.println("I'm jogging");
}
};
jog.start();
}
}
interface DoSports{
void start();
}
Lambda 表達式
public class TestLambda01 {
public static void main(String[] args) {
DoSports jog = ()->{
System.out.println("I'm jogging"); //start() 方法執行主體
};
jog.start();
}
}
interface DoSports{
void start();
}
含參數的 Lambda 表達式簡化
當只有一個參數時,可簡化參數類型和括號
public class TestLambda01 {
public static void main(String[] args) {
/*可簡化參數類型和括號
DoSports jog = (int a)->{
...
};*/
DoSports jog = a->{
//start() 方法執行主體
...
};
jog.start(參數1);
}
}
interface DoSports{
void start(int a);
}
當有多個參數時,可簡化參數類型,必須加括號
public class TestLambda01 {
public static void main(String[] args) {
/*可簡化參數類型和括號
DoSports jog = (int a,String b)->{
...
};*/
DoSports jog = (a,b)->{
//start() 方法執行主體
...
};
jog.start(參數1,參數2);
}
}
interface DoSports{
void start(int a,String b);
}
