Java基礎(26)之Lambda表達式

1. Lambda表達式

Java8新特徵之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();
	}
}

1.7 Lambda表達式和匿名內部類的區別

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章