1. 函數式編程思想
面向對象的思想:
- 做—件事情,找一個能解決這個事情的對象,調用對象的方法完成
函數式編程思想:
- 只要能獲取到想要的結果,誰去做的怎麼做的都不重要,重視的是結果不重視過程
2. Lambda表達式引入
爲什麼要使用Lambda表達式?
-
避免匿名內部類定義過多
-
讓代碼實現相同的邏輯看起來更加簡潔
函數式接口: 接口中只包含唯一一個抽象方法,那麼就是函數式接口
例如:
public interface Runnable {
public abstract void run();
}
Lambda是JDK8引入的新特性函數式接口是Lambda表達式的關鍵所在
有了函數式接口,我們就可以通過 lambda表達式來創建該接口的對象。
通常情況下,對於一個接口及實現類,我們都會這麼寫:
interface Lambda {
void lambda();
}
class MyLambda implements Lambda {
@Override
public void lambda() {
System.out.println("學習lambda表達式...");
}
}
public class LambdaLearn {
public static void main(String[] args) {
Lambda lb = new MyLambda();
lb.lambda();
}
}
學習lambda表達式…
我們需要寫三個類來實現接口,用函數式編程來看待帶的話就會顯得很繁瑣。於是,我們可以通過內部類來改進:
改進一:靜態內部類
將MyLambda
類中的代碼放到LambdaLeadn
中,變爲靜態內部類
interface Lambda {
void lambda();
}
public class LambdaLearn {
//靜態內部類
static class MyLambda implements Lambda {
@Override
public void lambda() {
System.out.println("學習lambda表達式...");
}
}
public static void main(String[] args) {
Lambda lb = new MyLambda();
lb.lambda();
}
}
學習lambda表達式…
然後,繼續簡化
改進二:成員內部類
將MyLambda
變爲成員內部類
interface Lambda {
void lambda();
}
public class LambdaLearn {
public static void main(String[] args) {
//成員內部類
class MyLambda implements Lambda {
@Override
public void lambda() {
System.out.println("學習lambda表達式...");
}
}
Lambda lb = new MyLambda();
lb.lambda();
}
}
再試試,還能簡化?
改進三:匿名內部類
直接通過匿名內部類來實現接口
interface Lambda {
void lambda();
}
public class LambdaLearn {
public static void main(String[] args) {
//成員內部類
new Lambda() {
@Override
public void lambda() {
System.out.println("學習lambda表達式...");
}
}.lambda();
}
}
通過內部類的三次改進,實現同樣的功能我們簡化了代碼。但是,如果匿名內部類定義了很多,功能實現了,但是代碼讀不懂了。於是,我們在此基礎上引入了lambda表達式
lambda表達式推倒
interface Lambda {
void lambda();
}
public class LambdaLearn {
public static void main(String[] args) {
Lambda lb = () -> {
System.out.println("學習lambda表達式...");
};
lb.lambda();
}
}
語義分析
-
前面的一對小括號即lambda方法的參數(無),代表不需要任何條件;
-
中間的一個箭頭
->
代表將前面的參數傳遞給後面的代碼; -
後面
{}
中的代碼爲重寫接口中抽象方法的方法體
那,lambda還能不能再簡化了?
3. lambda表達式簡化
簡化參數類型
定義一個有參的lambda表達式來簡化
interface Lambda {
void lambda(String str);
}
public class Simplify {
public static void main(String[] args) {
Lambda lb = (String str) -> {
System.out.println(str);
};
lb.lambda("lambda表達式");
}
}
-
簡化參數類型
-
簡化括號
-
簡化代碼塊
{ }
如果是多個參數則不能簡化
Lambda表達式實現Runnable接口
public class LThread {
public static void main(String[] args) {
//使用匿名內部類實現多線程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("線程" + Thread.currentThread().getName() + "創建了");
}
}).start();
//lambda實現多線程
new Thread(()-> {
System.out.println("線程" + Thread.currentThread().getName() + "創建了");
}
).start();
}
}
線程Thread-0創建了
線程Thread-1創建了