Lambda表達(dá)式的使用及注意事項(xiàng)
Lambda表達(dá)式的使用
練習(xí):
- 定義一個(gè)接口flyable,里面定義一個(gè)抽象方法 void fly(String s)
- 定義一個(gè)測(cè)試類flyabledemo,在測(cè)試類中提供兩個(gè)方法
一個(gè)方法是useFlyable(Flyable f)
主方法,在主方法中調(diào)用useflyable方法
package Demo16;
public interface Flyable {
void fly(String s );
}package Demo16;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
public class FlyableDemo {
public static void main(String[] args) {
useFlyable(new Flyable() {
@Override
public void fly(String s) {
System.out.println(s);
System.out.println("飛機(jī)自駕游");
}
});
System.out.println("----------------");
useFlyable( (String s ) -> {
System.out.println(s);
System.out.println("飛機(jī)自駕游");
});
}
private static void useFlyable(Flyable f){
f.fly("風(fēng)和日麗,晴空萬(wàn)里");
}
}練習(xí)2
- 定義一個(gè)接口(Addable),里面定義一個(gè)抽象方法, int add(int x ,int y)
- 定義一個(gè)測(cè)試類(AddableDemo),在測(cè)試類中提供兩個(gè)方法
一個(gè)方法是:useAddable(Addable)
一個(gè)主方法是,在主方法中調(diào)用useAddable方法
package Demo17;
public interface Addable {
int add(int x ,int y);
}package Demo17;
public class AddableDemo {
public static void main(String[] args) {
//在主方法中調(diào)用useAddable方法
useAddable( (int x ,int y ) ->{
return x+y;//簡(jiǎn)化重寫方法可以看做
});
}
private static void useAddable(Addable a){
int sum = a.add(10, 20);
System.out.println(sum);
}
}Lambda表達(dá)式的省略模式
省略規(guī)則:
- 參數(shù)類型可以省略,但是有多個(gè)參數(shù)的情況下,不能只省略一個(gè)
- 如果參數(shù)有且僅有一個(gè),那么小括號(hào)可以省略
- 如果代碼塊的語(yǔ)句只有一條,可以省略大括號(hào)和分號(hào),甚至是return。
package Demo17;
public class AddableDemo {
public static void main(String[] args) {
//在主方法中調(diào)用useAddable方法
// useAddable( (int x ,int y ) ->{
// return x+y;//簡(jiǎn)化重寫方法可以看做
//參數(shù)的類型可以省略
// useAddable( (x,y) -> {
// return x+y;
// });
// //類型雖然可以省略,但是有多個(gè)參數(shù)的情況下不能只省略一個(gè)
// useFlyable( (String s ) -> {
// System.out.println(s);
// });//如果參數(shù)有且僅有一個(gè),小括號(hào)可以省略
// useFlyable( s -> {
// System.out.println(s);
// });
//如果代碼塊的語(yǔ)句只有一條,可以省略大括號(hào)和分號(hào)
useFlyable( s -> System.out.println(s));
//useAddable( (x,y) -> return x+y);//如果有return,return也要省略,只針對(duì)代碼塊只有一條的情況
useAddable( (x,y) -> x+y);
}
private static void useAddable(Addable a){
int sum = a.add(10, 20);
System.out.println(sum);
}
private static void useFlyable(Flyable f){
f.fly("風(fēng)和日麗,晴空萬(wàn)里");
}
}Lambda使用注意事項(xiàng)
- 使用Lambda必須要有接口,并且接口中有且僅有一個(gè)抽此昂方法
- 必須有上下文環(huán)境,才能推導(dǎo)出lambda對(duì)應(yīng)接口
根據(jù)局部變量的賦值得知lambda對(duì)應(yīng)的接口:Runnable r = () -> System.out.println("lambda表達(dá)式");
根據(jù)調(diào)用方法的參數(shù)得知lambda對(duì)應(yīng)的接口:new Thread( () -> System.out.println("lambda表達(dá)式")).start();
package Demo18;
public class LambdaDemo {
public static void main(String[] args) {
// useInter( () -> {
// System.out.println("好好學(xué)習(xí),天天向上");
// });
//使用Lambda必須要有接口,并且接口有且僅有一個(gè)抽象方法
useInter( () -> System.out.println("好好學(xué)習(xí),天天向上"));
//必須要有上下文華寧,才能推導(dǎo)出lambda對(duì)應(yīng)接口
// new Thread(new Runnable() {
// @Override
// public void run() {
// System.out.println("匿名內(nèi)部類");
// }
// });
Runnable r = () -> System.out.println("lambda表達(dá)式");
new Thread(r).start();
new Thread( () -> System.out.println("lambda表達(dá)式")).start();
}
private static void useInter(Inter i ){
i.show();
}
}Lambda表達(dá)式和匿名內(nèi)部類的區(qū)別
所需類型不同:
- 匿名內(nèi)部類:可以是接口,也可以是抽象類,還有可以是具體類
- lambda表達(dá)式:只能是接口
使用限制不同:
- 如果接口中有且僅有一個(gè)抽象方法,可以使用lambda表達(dá)式,也可以使用匿名內(nèi)部類
- 如果接口中多于一個(gè)抽象方法,只能使用匿名內(nèi)部類,而不能使用lambda比表達(dá)式
實(shí)現(xiàn)原理不同:
- 匿名內(nèi)部類:編譯之后,產(chǎn)生一個(gè)單獨(dú)的.class字節(jié)碼文件
- lambda表達(dá)式:編譯之后,沒(méi)有一個(gè)單獨(dú)的.class文件,對(duì)應(yīng)哪個(gè)的字節(jié)碼會(huì)在運(yùn)行的時(shí)候動(dòng)態(tài)生成
package Demo19;
public class LambdaDemo {
public static void main(String[] args) {
////匿名內(nèi)部類,接口可以使用多個(gè)抽象方法
// useInter(new Inter() {
// @Override
// public void show1() {
// System.out.println("接口");
// }
// public void show2() {
// System.out.println("接口");
// }
// });
// useAnimal(new Animal() {
// @Override
// public void method() {
// System.out.println("抽象類");
// }
// });
// useStudent(new Student(){
// @Override
// public void study(){
// System.out.println("具體類");
// }
// });
//lambda,接口有且僅有一個(gè)抽象方法
// useInter( () -> System.out.println("接口"));
//useAnimal(() -> System.out.println("接口"));
// useStudent(() -> System.out.println("具體類"));
//使用lambda的地方參數(shù)必須是一個(gè)接口(有且只有一個(gè))
}
private static void useStudent(Student s ){s.study();}
private static void useAnimal(Animal a ){a.method();}
private static void useInter(Inter i ){i.show1();i.show2();}
}到此這篇關(guān)于Lambda表達(dá)式的使用及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Lambda表達(dá)式 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- LINQ教程之使用Lambda表達(dá)式
- 詳解Java8如何使用Lambda表達(dá)式進(jìn)行比較
- C#使用表達(dá)式樹(shù)(LambdaExpression)動(dòng)態(tài)更新類的屬性值(示例代碼)
- Java 進(jìn)階使用 Lambda 表達(dá)式實(shí)現(xiàn)超強(qiáng)的排序功能
- java Lambda表達(dá)式的使用心得
- Java中使用Lambda表達(dá)式和函數(shù)編程示例
- Java中Lambda表達(dá)式的使用詳解
- Java中forEach使用lambda表達(dá)式,數(shù)組和集合的區(qū)別說(shuō)明
相關(guān)文章
Java中volatile關(guān)鍵字實(shí)現(xiàn)原理
本文詳細(xì)解讀一下volatile關(guān)鍵字如何保證變量在多線程之間的可見(jiàn)性,對(duì)Java中volatile關(guān)鍵字實(shí)現(xiàn)原理感興趣的朋友一起通過(guò)本文學(xué)習(xí)吧2017-06-06
java實(shí)現(xiàn)識(shí)別二維碼圖片功能方法詳解與實(shí)例源碼
這篇文章主要介紹了java實(shí)現(xiàn)識(shí)別二維碼圖片,java無(wú)法識(shí)別二維碼情況下對(duì)二維碼圖片調(diào)優(yōu)功能方法與實(shí)例源碼,需要的朋友可以參考下2022-12-12
SpringBoot+Hutool實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼
圖片驗(yàn)證碼在注冊(cè)、登錄、交易、交互等各類場(chǎng)景中都發(fā)揮著巨大作用,本文主要介紹了SpringBoot+Hutool實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Java移位運(yùn)算符詳解實(shí)例(小結(jié))
這篇文章主要介紹了Java移位運(yùn)算符詳解實(shí)例(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
SpringBoot+ruoyi框架文件上傳和下載的實(shí)現(xiàn)
文件的上傳和下載功能,是項(xiàng)目開(kāi)發(fā)過(guò)程中比較常見(jiàn)的業(yè)務(wù)需求,本文主要介紹了SpringBoot+ruoyi框架文件上傳和文件下載的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
maven打包時(shí)候修改包名稱帶上git版本號(hào)和打包時(shí)間方式
這篇文章主要介紹了maven打包時(shí)候修改包名稱帶上git版本號(hào)和打包時(shí)間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解
這篇文章主要介紹了@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

