Java8學(xué)習(xí)教程之lambda表達(dá)式語法介紹
前言
相信大家都知道,在Java8 中引入了 lambda 表達(dá)式,從行為參數(shù)化的角度,在使用時(shí),將行為作為參數(shù),去除包圍在外層的不必要的類聲明,使代碼更加簡潔。
lambda 表達(dá)式的語法
lambda 表達(dá)式由參數(shù),->,以及函數(shù)體三部分組成。其實(shí)函數(shù)體可以是表達(dá)式,也可以是語句。語句應(yīng)該包含在{} 里,而表達(dá)式不能。
lambda 表達(dá)式舉例
(List<String> list) -> list.isEmpty() // 布爾類型表達(dá)式 () -> new Apple(10) // 創(chuàng)建一個(gè)新對象 (Apple a) -> { System.out.println(a.getWeight()); } // 使用一個(gè)對象的屬性 (String s) -> s.length() // 選擇或提取一個(gè)對象的屬性 (int a, int b) -> a * b // 組合兩個(gè)參數(shù) (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) // 比較兩個(gè)對象
行為參數(shù)化
可以看到,lambda 表達(dá)式著重表達(dá)了行為。其實(shí)在 java8 之前,就已經(jīng)有類似將行為作為參數(shù)進(jìn)行處理的例子:
// java.util.Comparator public interface Comparator<T> { public int compare(T o1, T o2); }
inventory.sort(new Comparator<Apple>() { public int compare(Apple a1, Apple a2){ return a1.getWeight().compareTo(a2.getWeight()); } });
在上面的例子中,定義了一個(gè) Comparator 接口,并且定義了 compare 方法。List 類型的 inventory,定義了 sort 方法,該方法以 Comparator 作為參數(shù)。在使用時(shí),生成一個(gè)匿名或不匿名的 Comparator 對象,該對象實(shí)現(xiàn)了 compare 方法,指定了具體的比較行為,再將 Comparator 對象作為參數(shù),傳給 sort 方法。實(shí)際上的作用,就是將比較行為,作為參數(shù),傳給 sort 方法,這種思想和做法就叫作“行為參數(shù)化”。一個(gè)使用的方法(比如 sort 方法)可以對應(yīng)多種行為,當(dāng)需要更改行為時(shí),只需要修改表示行為的代碼,使用方不必做出修改,增加了代碼的健壯性。
匿名內(nèi)部類
而像上面的例子中,直接 new 一個(gè) Comparator 類型對象,而沒有定義一個(gè)變量保存該對象的引用,叫做使用匿名內(nèi)部類。在匿名內(nèi)部類的情況下,由于方法不能重復(fù)使用,可以更加明顯地看到代碼的冗余。因?yàn)槊看卧谑褂脮r(shí)需要手動(dòng) new 一個(gè)對象,并且還要寫出 compare 方法的簽名,而真正有用的其實(shí)只是 compare 的方法體。在 Java8 中,使用 lambda 表達(dá)式,可以簡化這些代碼。比如上面的 sort 方法的使用,可以簡化為:
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight() ) );
定義線程的例子:
Thread t = new Thread(new Runnable() { public void run(){ System.out.println("Hello world"); } });
可以簡化為:
Thread t = new Thread(() -> System.out.println("Hello world"));
GUI 中點(diǎn)擊事件的例子:
Button button = new Button("Send"); button.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { label.setText("Sent!!"); } });
可以簡化為:
Button button = new Button("Send"); button.setOnAction((ActionEvent event) -> label.setText("Sent!!"));
可以看出,lambda 表達(dá)式更加簡潔,也可以使開發(fā)者在讀寫代碼時(shí),可以更加專注在定義的行為上。
小結(jié)
這篇文章介紹了 lambda 表達(dá)式的語法,引入 lambda 表達(dá)式的使用場景,以及使用 lambda 表達(dá)式的好處。我們將在下篇文章中講解如何定義和使用 lambda 表達(dá)式,以及與其它語言相比,lambda 表達(dá)式在 Java 中的特殊規(guī)范。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- Java8之lambda表達(dá)式基本語法
- Java8新特性lambda表達(dá)式有什么用(用法實(shí)例)
- Java8深入學(xué)習(xí)系列(一)lambda表達(dá)式介紹
- Java8 用Lambda表達(dá)式給List集合排序的實(shí)現(xiàn)
- Java8新特性之Lambda表達(dá)式淺析
- Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)
- Java8中l(wèi)ambda表達(dá)式的應(yīng)用及一些泛型相關(guān)知識
- Java8使用lambda實(shí)現(xiàn)Java的尾遞歸
- Java8中Lambda表達(dá)式使用和Stream API詳解
- Java8語法糖之Lambda表達(dá)式的深入講解
相關(guān)文章
Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡單端口掃描器示例
這篇文章主要介紹了Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡單端口掃描器,涉及Java網(wǎng)絡(luò)編程Socket組建、swing組建及多線程相關(guān)操作技巧,需要的朋友可以參考下2018-04-044個(gè)Java8中你需要知道的函數(shù)式接口分享
Java?8?中提供了許多函數(shù)式接口,包括Function、Consumer、Supplier、Predicate?等等。本文主要來和大家介紹一下它們的具體使用,需要的可以參考一下2023-04-04Java復(fù)制(拷貝)數(shù)組的4種方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRa
這篇文章主要介紹了Java復(fù)制(拷貝)數(shù)組的4種方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Mybatis中SqlMapper配置的擴(kuò)展與應(yīng)用詳細(xì)介紹(1)
這篇文章主要介紹了Mybatis中SqlMapper配置的擴(kuò)展與應(yīng)用(1)的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11Springboot啟用多個(gè)監(jiān)聽端口代碼實(shí)例
這篇文章主要介紹了Springboot啟用多個(gè)監(jiān)聽端口代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06SpringBoot使用Feign調(diào)用其他服務(wù)接口
這篇文章主要介紹了SpringBoot使用Feign調(diào)用其他服務(wù)接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解
這篇文章主要為大家介紹了Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11