java複習筆記--Lambda表示式
阿新 • • 發佈:2021-01-27
Lambda表示式
函數語言程式設計思想概述
函式式思想則儘量忽略面向物件的複雜語法:“強調做什麼,而不是以什麼形式去做”
而我們要學習的Lambda表示式就是函式式思想的體現
Lambda表示式的標準格式
格式:
(形式引數) -> {程式碼塊}
形式引數:如果有多個引數,引數之間用逗號隔開;如果沒有引數,留空即可
- >:由英文中畫線和大於符號組成,固定寫法。代表指向動作
程式碼塊:是我們具體要做的事情,也就是以前我們寫的方法體內容
Lambda表示式的使用前提
有一個介面
介面中有且僅有一個抽象方法
體驗Lambda表示式
啟動一個執行緒
實現方式一
實現步驟
定義一個類MyRunnable實現Runnable介面,重寫run()方法
建立MyRunnable類的物件
建立Thread類的物件,把MyRunnable的物件作為構造引數傳遞
啟動執行緒
public class myrunnable implements Runnable{
@Override
public void run() {
System.out.println("實現介面的方式");
}
}
public class myrunnabletest {
public static void main(String[] args) {
myrunnable my = new myrunnable();
Thread t1=new Thread(my);
t1.start(); //實現介面的方式
}
}
實現方式二
匿名內部類
public class myrunnabletest {
public static void main(String[] args) {
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名內部類的方式");
}
});
t1.start(); //匿名內部類的方式
}
}
實現方式三
Lambda表示式
public class myrunnabletest {
public static void main(String[] args) {
Thread t1=new Thread(()->{
System.out.println("Lambda表示式");
}
);
t1.start(); //Lambda表示式
}
}
無參無返回值抽象方法的練習
public class flydemo {
public static void main(String[] args) {
//1
flyable f=new flyImpl();
useflyable(f);
//2
useflyable(new flyable() {
@Override
public void fly() {
System.out.println("我會飛");
}
});
//3
useflyable(()->{
System.out.println("我會飛");
});
}
public static void useflyable(flyable f){
f.fly();
}
}
有參無返回值抽象方法的練習
public class flydemo {
public static void main(String[] args) {
//1
flyable f=new flyImpl();
useflyable(f);
//2
useflyable(new flyable() {
@Override
public void fly(String name, String o) {
System.out.println("我是"+name+"會飛,飛的比"+o+"快");
}
});
//3
useflyable((String name,String o)->{
System.out.println("我是"+name+"會飛,飛的比"+o+"快");
});
}
public static void useflyable(flyable f){
f.fly("dyk","飛機");
}
}
有參有返回值抽象方法的練習
public class flydemo {
public static void main(String[] args) {
//1
flyable f=new flyImpl();
useflyable(f);
//2
useflyable(new flyable() {
@Override
public int add(int a, int b) {
return a+b;
}
});
//3
useflyable((int a,int b)->{
return a+b;
});
}
public static void useflyable(flyable f){
int sum=f.add(1,2);
System.out.println("和為:"+sum);
}
}
Lambda表示式的省略模式
省略的規則
引數型別可以省略。但是有多個引數的情況下,不能只省略一個
如果引數有且僅有一個,那麼小括號可以省略
如果程式碼塊的語句只有一條,可以省略大括號和分號,如果有return,return也要省略掉
引數型別可以省略。但是有多個引數的情況下,不能只省略一個
public class flydemo {
public static void main(String[] args) {
//引數的型別可以省略
useflyable(( a,b)->{
return a+b;
});
}
public static void useflyable(flyable f){
int sum=f.add(1,2);
System.out.println("和為:"+sum);
}
}
如果只省略一個會報錯
如果引數有且僅有一個,那麼小括號可以省略
public class flydemo {
public static void main(String[] args) {
//如果引數有且僅有一個,那麼小括號可以省略
useflyable(a->{
return a+2;
});
}
public static void useflyable(flyable f){
int sum=f.add(1);
System.out.println("和為:"+sum);
}
}
如果程式碼塊的語句只有一條,可以省略大括號和分號,和return關鍵字
public class flydemo {
public static void main(String[] args) {
//3
useflyable(a->a+2);
}
public static void useflyable(flyable f){
int sum=f.add(1);
System.out.println("和為:"+sum);
}
}
Lambda表示式的注意事項
使用Lambda必須要有介面,並且要求介面中有且僅有一個抽象方法
必須有上下文環境,才能推匯出Lambda對應的介面
根據區域性變數的賦值得知Lambda對應的介面
Runnable r = () -> System.out.println("Lambda表示式");
根據呼叫方法的引數得知Lambda對應的介面
new Thread(() -> System.out.println("Lambda表示式")).start();
Lambda表示式和匿名內部類的區別
所需型別不同
匿名內部類:可以是介面,也可以是抽象類,還可以是具體類
Lambda表示式:只能是介面
使用限制不同
如果介面中有且僅有一個抽象方法,可以使用Lambda表示式,也可以使用匿名內部類
如果介面中多於一個抽象方法,只能使用匿名內部類,而不能使用Lambda表示式
實現原理不同
匿名內部類:編譯之後,產生一個單獨的.class位元組碼檔案
Lambda表示式:編譯之後,沒有一個單獨的.class位元組碼檔案。對應的位元組碼會在執行的時候動態生成