1. Lambda表達式
1.1 函數式編程思想概述
1.2 體驗Lambda表達式
代碼示例:
方式一就不演示了,可以去看Java基礎24
方式2:
匿名內部類的方式改進
public class LambdaDemo {
public static void main(String[] args) {
// 匿名內部類的方式改進
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("多線程啓動了!");
}
}).start();
}
}
運行結果:
方式3:
Lambda表達式的方式改進
public class LambdaDemo {
public static void main(String[] args) {
// Lambda表達式的方式改進
new Thread(() -> {
System.out.println("多線程啓動了!");
}).start();
}
}
運行結果:
1.3 Lambda表達式的標準格式
兩個方式做的是相同的事情,只不過Lambda表達式更加的簡潔只做了我們要做的事情。
使用該方式更加關注的是要做的事情。
1.4 Lambda表達式的練習
1.4.1 練習1( 抽象方法無參)
代碼示例:
這裏採用的是Lambda表達式接口的方式,還可以使用常規的方式實現接口中的方法,也可以使用匿名內部類,但是這是三種方式Lambda表達式是最簡潔的。
定義接口:
//1:定義一個接口(Eatable),裏面定義一個抽象方法: void eat();
public interface Eatable {
void eat();
}
創建實現類:
//2:定義一一個測試類(EatableDemo),在測試類中提供兩個方法
public class EatableDemo {
// 一個方法是主方法,在主方法中調用useEatable方法
public static void main(String[] args) {
// 調用useEatable方法
// 使用Lambda表達式
useEatable(() -> {
System.out.println("一天一蘋果,醫生遠離我");
});
}
// 一個方法是: useEatable(Eatable e)
public static void useEatable(Eatable e) {
e.eat();
}
}
運行結果:
1.4.2 練習2(抽象方法有參)
代碼示例:
定義接口:
//1:定義一個接口(Flyable),裏面定義一個抽象方法: void fly(String s);
public interface Flyable {
void fly(String s);
}
創建實現類:
使用了匿名內部類和Lambda方式,兩個方法。
//2:定義一個測試類(FLyableDemo),在測試類中提供兩個方法
//一個方法是: useFlyable(Flyable f)
//一個方法是主方法,在主方法中調用useFlyable方法
public class FlyableDemo {
public static void useFlyable(Flyable f) {
f.fly("風和日麗,晴空萬里");
}
private static void main(String[] args) {
// 匿名內部類
useFlyable(new Flyable() {
@Override
public void fly(String s) { //這裏的s是useFlyable方法定義的
System.out.println(s);
System.out.println("飛機自駕遊");
}
});
System.out.println("-------------------");
// Lambda表達式
useFlyable((String s) -> {
System.out.println(s);
System.out.println("飛機自駕遊");
});
}
}
1.4.3 練習3(抽象方法有參有返回值)
代碼示例:
定義接口:
//1:定義一個接口(Addable),裏面定義一個抽象方法: int add(int x, int y);
public interface Addable {
int add(int x, int y);
}
創建測試類:
//2:定義一個測試類(AddableDemo),在測試類中提供兩個方法
// 一個方法是: useAddable(Addable a)
// 一個方法是主方法,在主方法中調用useAddable方法
public class AddableDemo {
public static void main(String[] args) {
useAddable((int x, int y) -> {
return x + y;
});
}
private static void useAddable(Addable a) {
int add = a.add(10, 20);
System.out.println(add);
}
}
運行結果:
1.5 Lambda表達式的省略模式
代碼示例:
Addable接口,int類型有參有返回值
public interface Addable {
int add(int x, int y);
}
Flyable接口,String類型有參無返回值
public interface Flyable {
void fly(String s);
}
測試類:
public class LambdaDemo {
public static void main(String[] args) {
// 在這裏只使用Lambda方式
// useAddable(Addable a)方法
// 常規方式
useAddable((int x, int y) -> {
return x + y;
});
// 參數的類型可以省略,但是有多個參數的情況下不能就省略一個
useAddable((x, y) -> {
return x + y;
});
System.out.println("----------------------");
// useFlyable(Flyable f)方法
// 常規方法
useFlyable((String s) -> {
System.out.println(s);
});
// 省略參數類型
useFlyable((s) -> {
System.out.println(s);
});
// 如果代碼塊的語句只有一條,可以省略大括號和分號
useFlyable(s -> System.out.println(s));
// 如果代碼塊的語句只有一條,可以省略大括號和分號,如果有return,return也要省略掉
useAddable((x, y) -> x + y);
}
private static void useFlyable(Flyable f) {
f.fly("風和日麗,晴天萬里");
}
private static void useAddable(Addable a) {
int i = a.add(10, 20);
System.out.println(i);
}
}
運行結果:
方法都可以正常運行
1.6 Lambda表達式的注意事項
public class LambdaDemo01 {
public static void main(String[] args) {
// 這樣寫是會報錯的,因爲沒有上下文環境
// () -> System.out.println("Lambda表達式");
// 必須有上下文環境,才能推導出Lambda對應的接口
// 根據局部變量的賦值得知L ambda對應的接口:
Runnable r = () -> System.out.println("Lambda表達式");
// 根據調用方法的參數得知L ambda對應的接口:
new Thread(() -> System.out.println("Lambda表達式")).start();
}
}