Lambda表達式 函數式編程: 函數: 函數就是有輸入量、輸出量的一套計算方案,也就是“拿數據做操作”面向對象思想強調“必須通過對象的形式來做事情” 函數式思想: 儘量忽略面向對象的複雜語法:“強調做什麼,而不是以什麼形式去做”,Lambda表達式就是函數思想的體現 例1: 需求:啟動一個線程,在 ...
Lambda表達式
函數式編程:
函數:
- 函數就是有輸入量、輸出量的一套計算方案,也就是“拿數據做操作”面向對象思想強調“必須通過對象的形式來做事情”
函數式思想: - 儘量忽略面向對象的複雜語法:“強調做什麼,而不是以什麼形式去做”,Lambda表達式就是函數思想的體現
例1:
需求:啟動一個線程,在控制太輸出一句話:多線程程式啟動了
方式一:
public class Demo {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();
}
}
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("多線程程式啟動了");
}
}
方式二:
- 匿名內部類
public class Demo {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("多線程程式啟動了");
}
}).start();
}
}
方式三:
- Lambda表達式:
public class LambdaDemo {
public static void main(String[] args) {
new Thread(() -> {
System.out.println("多線程程式啟動了");
}).start();
}
}
Lambda標準格式:
匿名內部類中重寫run()方法的代碼分析
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("多線程程式啟動了");
}
}).start();
- 方法形式參數為空,說明調用方法時不需要傳遞參數
- 方法返回值為void,說明方法執行沒有結果返回
- 方法體中的內容,時我們具體要做的事情
Lambda表達式的代碼分析
new Thread(() -> {
System.out.println("多線程程式啟動了");
}).start();
- ():裡面沒有內容,可以看成是方法形式為空
- ->:用箭頭指向後面要做的事情
- {}:包含一段代碼,我們稱之為代碼塊,可以看成是方法體中的內容
Lambda表達式的三要素:形式參數,箭頭,代碼塊
Lambda表示的格式
- 格式:(形式參數) -> {代碼塊}
- 形式參數:如果有多個參數,參數之間用逗號隔開;如果沒有參數,留空
- ->:由英文中畫線和大於符號組成,固定寫法,代表指向性動作
- 代碼塊:具體要做的事情,也就是之前寫方法體的內容
練習
Lambda表達式的使用前提:
- 有一個介面
- 介面中有且只有一個抽象方法
練習一:
- 定義一個介面(Eatable),裡面定義一個抽象方法:void eat():
- 定義一個測試類(Demo),在測試類中提供兩個方法
- 一個方法是:useEatable(Eatable e)
- 一個方法是主方法,在主方法中調用useEatable方法
public interface Eatable {
void eat();
}
public class Demo {
public static void main(String[] args) {
useEatable(() -> {
System.out.println("Hello,World");
});
}
private static void useEatable(Eatable e){
e.eat();
}
}
練習二:
- 定義一個介面(Flyable),裡面定義一個抽象方法:void fly(String s):
- 定義一個測試類(Demo),在測試類中提供兩個方法
- 一個方法是:useEatable(Flyable f)
- 一個方法是主方法,在主方法中調用useFlyable方法
public interface Flyable {
void fly(String s);
}
public class Demo {
public static void main(String[] args) {
//匿名內部類:
useFlyable(new Flyable() {
@Override
public void fly(String s) {
System.out.println(s);
System.out.println("風和日麗");
}
});
System.out.println("---------------");
//Lambda表達式
useFlyable((String s) -> {
System.out.println(s);
System.out.println("風和日麗");
});
}
private static void useFlyable(Flyable f){
f.fly("晴空萬里");
}
}
練習三:
- 定義一個介面(Addable),裡面定義一個抽象方法:int add(int x, int y)
- 定義一個測試類(Demo),在測試類中提供兩個方法
- 一個方法是:useAddable(Addable a)
- 一個方法是主方法,在主方法中調用useAddable方法
public interface Addable {
int add(int x, int y);
}
public class Demo {
public static void main(String[] args) {
//匿名內部類
useAddable(new Addable() {
@Override
public int add(int x, int y) {
return x + y;
}
});
System.out.println("------------");
//Lambda表達式
useAddable((int x, int y) -> {
return x + y;
});
}
private static void useAddable(Addable a) {
int sum = a.add(3, 4);
System.out.println(sum);
}
}
Lambda省略模式
public class Demo {
public static void main(String[] args) {
//無省略
useAddable((int x, int y) -> {
return x + y;
});
useFlyable((String s) -> {
System.out.println(s);
});
System.out.println("------------");
//參數類型省略
useAddable((x, y) -> {
return x + y;
});
useFlyable(s -> {
System.out.println(s);
});
System.out.println("----------------");
//若代碼塊有且只有一條語句,可以省略大括弧和分號,若有return語句也要省略return;
useAddable((x, y) -> x + y);
useFlyable(s -> System.out.println(s));
}
private static void useAddable(Addable a) {
int sum = a.add(10, 30);
System.out.println(sum);
}
private static void useFlyable(Flyable f) {
f.fly("陽光明媚,風和日麗");
}
}