Java 8 引入lambda表達(dá)式的原因解析
在Java8出現(xiàn)之前,如果你想傳遞一段代碼到另一個方法里是很不方便的。你幾乎不可能將代碼塊到處傳遞,因為Java是一個面向?qū)ο蟮恼Z言,因此你要構(gòu)建一個屬于某個類的對象,由它的某個方法來放置你想傳遞的代碼塊。
下面看兩個非常典型的例子,構(gòu)造線程與比較器:
構(gòu)造線程:
我們要想在另一個線程中執(zhí)行一些代碼邏輯時,通常會將代碼放在一個實現(xiàn)Runnable接口的run方法當(dāng)中,如下圖:
public static void main(String[] args) { myThread t = new myThread(); } class myThread implements Runnable { @Override public void run() { System.out.println("放入你想執(zhí)行的代碼"); } }
你寫這段代碼的目的就是想開啟新的線程來執(zhí)行你定制的代碼,為此你創(chuàng)建了myThread。
接著我們看下構(gòu)造比較器:
public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(2); list.add(5); list.add(1); list.add(4); list.add(3); Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }; Collections.sort(list, comparator); }
sort 方法會不斷調(diào)用compare 方法,對順序不對的元素進(jìn)行重新排序,直到有序為止。你寫比較器的目的就是給Collections的sort方法傳遞一段比較邏輯的代碼片段,這段代碼會被整合到排序排序邏輯中,為此你寫了一個類和一個方法。
上述兩個例子你會看到它們的相似點,將一段代碼傳遞給其他調(diào)用者(一個線程池或者一個排序方法),這段代碼會在新的方法中被調(diào)用。
但是,在Java8出現(xiàn)之前,如果你想傳遞一段代碼到另一個方法里是很不方便的,因為Java是一個面向?qū)ο蟮恼Z言,因此你要構(gòu)建一個屬于某個類的對象,由它的某個方法來放置你想傳遞的代碼塊。而在一些其他語言中可以直接傳遞代碼塊,比如JS。為此,Java決定加入了lambda表達(dá)式的語法糖。
lambda改造
對于傳入比較器代碼塊,我們的目的是想傳入一段比較邏輯,利用lambda表達(dá)式可以:
lambda表達(dá)式的語法格式是:參數(shù)->一個表達(dá)式,如果想傳入的代碼無法用一個表達(dá)式表示,則可以用 參數(shù)->{多個表達(dá)式}。如果沒有參數(shù)需要傳遞,則可以用()->表達(dá)式的形式。
public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(2); list.add(5); list.add(1); list.add(4); list.add(3); Collections.sort(list, (one,two)->{ System.out.println("one="+one); System.out.println("two="+two); return two - one; }); }
編譯器會解析出來 one 與 two 是原先接口compare方法的入?yún)?,并自動賦予Integer類型。
對于構(gòu)造線程,我們的目的就是想傳入一段線程執(zhí)行的代碼,利用lambda表達(dá)式可以這樣做:
public static void main(String[] args) { new Thread(() -> { for (int i = 0; i < 100; i++) { System.out.println("這是一個線程" + i); } }).start(); for (int i = 100; i < 200; i++) { System.out.println("這是主線程" + i); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springmvc fastjson 反序列化時間格式化方法(推薦)
下面小編就為大家?guī)硪黄猻pringmvc fastjson 反序列化時間格式化方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04Java實現(xiàn)base64圖片編碼數(shù)據(jù)轉(zhuǎn)換為本地圖片的方法
這篇文章主要介紹了Java實現(xiàn)base64圖片編碼數(shù)據(jù)轉(zhuǎn)換為本地圖片的方法,涉及java編碼轉(zhuǎn)換及圖片文件生成相關(guān)操作技巧,需要的朋友可以參考下2018-06-06java面向?qū)ο笤O(shè)計原則之合成復(fù)用原則示例詳解
這篇文章主要介紹了java面向?qū)ο笤O(shè)計原則之合成復(fù)用原則的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10java自動根據(jù)文件內(nèi)容的編碼來讀取避免亂碼
這篇文章主要介紹了java自動根據(jù)文件內(nèi)容的編碼來讀取避免亂碼,需要的朋友可以參考下2014-02-02Java實現(xiàn)基于JDBC操作mysql數(shù)據(jù)庫的方法
這篇文章主要介紹了Java實現(xiàn)基于JDBC操作mysql數(shù)據(jù)庫的方法,結(jié)合實例形式分析了java使用JDBC實現(xiàn)針對mysql數(shù)據(jù)庫的連接、查詢、輸出等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12詳解Springboot應(yīng)用啟動以及關(guān)閉時完成某些操作
這篇文章主要介紹了詳解Springboot應(yīng)用啟動以及關(guān)閉時完成某些操作,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11詳解SpringBoot+SpringSecurity+jwt整合及初體驗
這篇文章主要介紹了詳解SpringBoot+SpringSecurity+jwt整合及初體驗,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06MyBatis 如何配置多個別名 typeAliasesPackage
這篇文章主要介紹了MyBatis 如何配置多個別名 typeAliasesPackage,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01