函數語言程式設計思想概述
在數學中,函式就是有輸入量、輸出量的一套計算方案,也就是“拿資料做操作” 物件導向思想強調“必須通過物件的形式來做事情”
函式式思想則儘量忽略物件導向的複雜語法:“強調做什麼,而不是以什麼形式去做” 而我們要學習的Lambda表示式就是函式式思想的體現
Lambda表示式的標準格式
格式:
(形式引數) -> {程式碼塊}
形式引數:如果有多個引數,引數之間用逗號隔開;如果沒有引數,留空即可
->:由英文中畫線和大於符號組成,固定寫法。代表指向動作
程式碼塊:是我們具體要做的事情,也就是以前我們寫的方法體內容
組成Lambda表示式的三要素:
形式引數,箭頭,程式碼塊
無參無返回值抽象方法
Lambda表示式的使用前提
有一個介面
介面中有且僅有一個抽象方法
操作步驟
定義一個介面(Eatable),裡面定義一個抽象方法:void eat();
定義一個測試類(EatableDemo),在測試類中提供兩個方法
一個方法是:useEatable(Eatable e)
一個方法是主方法,在主方法中呼叫useEatable方法
//介面
interface Eatable {
void eat();
}
//實現類
class EatableImpl implements Eatable {
@Override
public void eat() {
System.out.println("一天一蘋果,醫生遠離我");
}
}
//測試類
public class test {
public static void main(String[] args) {
//在主方法中呼叫useEatable方法
Eatable e = new EatableImpl(); //父類引用指向子類物件
useEatable(e);
//匿名內部類
useEatable(new Eatable() {
@Override
public void eat() {
System.out.println("一天一蘋果,醫生遠離我");
}
});
//Lambda表示式
useEatable(()-> {
System.out.println("一天一蘋果,醫生遠離我");
});
}
private static void useEatable(Eatable e) {
e.eat();
}
}
有參無返回值抽象方法
操作步驟
定義一個介面(Flyable),裡面定義一個抽象方法:void flfly(String s);
定義一個測試類(FlyableDemo),在測試類中提供兩個方法
一個方法是:useFlyable(Flyable f)
一個方法是主方法,在主方法中呼叫useFlyable方法
interface Flyable {
void fly(String s);
}
public class test {
public static void main(String[] args) {
//在主方法中呼叫useFlyable方法
//匿名內部類
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);
定義一個測試類(AddableDemo),在測試類中提供兩個方法
一個方法是:useAddable(Addable a)
一個方法是主方法,在主方法中呼叫useAddable方法
interface Addable {
int add(int x, int y);
}
public class test {
public static void main(String[] args) {
//在主方法中呼叫useAddable方法
useAddable((int x, int y) -> {
return x + y;
});
}
private static void useAddable(Addable a) {
int sum = a.add(10, 20);
System.out.println(sum);
}
}
Lambda表示式的省略模式
省略的規則
引數型別可以省略。但是有多個引數的情況下,不能只省略一個
如果引數有且僅有一個,那麼小括號可以省略
如果程式碼塊的語句只有一條,可以省略大括號和分號,和return關鍵字
interface Addable {
int add(int x, int y);
}
interface Flyable {
void fly(String s);
}
public class test {
public static void main(String[] args) {
// useAddable((int x,int y) ‐> {
// return x + y;
// });
// 引數的型別可以省略
useAddable((x, y) -> {
return x + y;
});
//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 sum = a.add(10, 20);
System.out.println(sum);
}
}
Lambda表示式的使用前提
使用Lambda必須要有介面
並且要求介面中有且僅有一個抽象方法
Lambda表示式和匿名內部類的區別
所需型別不同
匿名內部類:可以是介面,也可以是抽象類,還可以是具體類
Lambda表示式:只能是介面
使用限制不同
如果介面中有且僅有一個抽象方法,可以使用Lambda表示式,也可以使用匿名內部類
如果介面中多於一個抽象方法,只能使用匿名內部類,而不能使用Lambda表示式
實現原理不同
匿名內部類:編譯之後,產生一個單獨的.class位元組碼檔案
Lambda表示式:編譯之後,沒有一個單獨的.class位元組碼檔案。對應的位元組碼會在執行的時候動態生成