为什么Java需要lambda 表达式?
Java 為什么會(huì)引入lambda ?
在Java8出現(xiàn)之前,如果你想傳遞一段代碼到另一個(gè)方法里是很不方便的。你幾乎不可能將代碼塊到處傳遞,因?yàn)镴ava是一個(gè)面向?qū)ο蟮恼Z(yǔ)言,因此你要構(gòu)建一個(gè)屬于某個(gè)類(lèi)的對(duì)象,由它的某個(gè)方法來(lái)放置你想傳遞的代碼塊。
下面看兩個(gè)非常典型的例子,構(gòu)造線程與比較器:
構(gòu)造線程:
我們要想在另一個(gè)線程中執(zhí)行一些代碼邏輯時(shí),通常會(huì)將代碼放在一個(gè)實(shí)現(xiàn)Runnable接口的run方法當(dāng)中,如下圖:
public static void main(String[] args) {myThread t = new myThread();}class myThread implements Runnable {@Overridepublic void run() {System.out.println("放入你想執(zhí)行的代碼");} }你寫(xiě)這段代碼的目的就是想開(kāi)啟新的線程來(lái)執(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>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}};Collections.sort(list, comparator); }sort 方法會(huì)不斷調(diào)用compare 方法,對(duì)順序不對(duì)的元素進(jìn)行重新排序,直到有序?yàn)橹埂D銓?xiě)比較器的目的就是給Collections的sort方法傳遞一段比較邏輯的代碼片段,這段代碼會(huì)被整合到排序排序邏輯中,為此你寫(xiě)了一個(gè)類(lèi)和一個(gè)方法。
上述兩個(gè)例子你會(huì)看到它們的相似點(diǎn),將一段代碼傳遞給其他調(diào)用者(一個(gè)線程池或者一個(gè)排序方法),這段代碼會(huì)在新的方法中被調(diào)用。
但是,在Java8出現(xiàn)之前,如果你想傳遞一段代碼到另一個(gè)方法里是很不方便的,因?yàn)镴ava是一個(gè)面向?qū)ο蟮恼Z(yǔ)言,因此你要構(gòu)建一個(gè)屬于某個(gè)類(lèi)的對(duì)象,由它的某個(gè)方法來(lái)放置你想傳遞的代碼塊。而在一些其他語(yǔ)言中可以直接傳遞代碼塊,比如JS。為此,Java決定加入了lambda表達(dá)式的語(yǔ)法糖。
lambda改造
對(duì)于傳入比較器代碼塊,我們的目的是想傳入一段比較邏輯,利用lambda表達(dá)式可以:
lambda表達(dá)式的語(yǔ)法格式是:參數(shù)->一個(gè)表達(dá)式,如果想傳入的代碼無(wú)法用一個(gè)表達(dá)式表示,則可以用 參數(shù)->{多個(gè)表達(dá)式}。如果沒(méi)有參數(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;});}編譯器會(huì)解析出來(lái) one 與 two 是原先接口compare方法的入?yún)?#xff0c;并自動(dòng)賦予Integer類(lèi)型。
對(duì)于構(gòu)造線程,我們的目的就是想傳入一段線程執(zhí)行的代碼,利用lambda表達(dá)式可以這樣做:
public static void main(String[] args) {new Thread(() -> {for (int i = 0; i < 100; i++) {System.out.println("這是一個(gè)線程" + i);}}).start();for (int i = 100; i < 200; i++) {System.out.println("這是主線程" + i);} }從上述的例子可以看出,有了lambda表達(dá)式,傳遞代碼塊變得更為簡(jiǎn)單,對(duì)于一些特定的使用場(chǎng)景,例如Steam API,lambda會(huì)大大提高你的代碼效率,并且比傳統(tǒng)的方式要更為易讀(當(dāng)然,前提是你知道lambda表達(dá)式的語(yǔ)法)。
總的來(lái)說(shuō),所有的lambda表達(dá)式都是延遲執(zhí)行的,如果你希望立即執(zhí)行一段代碼,那就沒(méi)必要使用lambda表達(dá)式了,延遲執(zhí)行代碼的原因有很多種:
在實(shí)際工作中還是比較推薦大家使用的,有人可能會(huì)拿性能說(shuō)事,但你想一想lambda表達(dá)的性能損耗可比查詢(xún)一次MySQL代價(jià)小的太多了。
轉(zhuǎn)載于:https://www.cnblogs.com/keeya/p/11404631.html
總結(jié)
以上是生活随笔為你收集整理的为什么Java需要lambda 表达式?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTML基础1
- 下一篇: vue 上传图片 input=file