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("陽光明媚,風和日麗");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/170776.html
標籤:Java
下一篇:(易忘篇)java基礎編程難點3
