摘要:表達(dá)式說(shuō)白了就是一種匿名方法,不需要方法名,修飾符,和返回值類型。就目前而言表達(dá)式只能簡(jiǎn)化接口的匿名內(nèi)部類實(shí)現(xiàn)。
Lambda表達(dá)式說(shuō)白了就是一種匿名方法,不需要方法名,修飾符,和返回值類型。
使用方法
首先在moudle的build.gradle文件中添加配置:app/build.gradle添加。
android { ... defaultConfig { ... jackOptions.enabled=true; } compileOptions{ sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } ... }
就這樣配置就OK了;
接下來(lái)我們來(lái)看看怎么使用;
首先拿一個(gè)點(diǎn)擊事件來(lái)比對(duì)一下:
一般寫(xiě)法
button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) { } });
解說(shuō):這是一種匿名內(nèi)部類的寫(xiě)法,較之外部類的寫(xiě)法已經(jīng)算是很簡(jiǎn)潔了。
Lambda表達(dá)式*
button.setOnClickListener(view ->{
});
解說(shuō):不難發(fā)現(xiàn),Lambda的這種寫(xiě)法連匿名內(nèi)部類都不用寫(xiě)了,更加簡(jiǎn)潔了,直接將參數(shù)暴露在外,在方法體中可以直接調(diào)用該參數(shù);如果沒(méi)有參數(shù)就用()就行,例如開(kāi)啟線程的寫(xiě)法:
new Thread(() -> {
});
到這里大家可能就要說(shuō)了:不就是少了兩行代碼,有什么了不起,學(xué)的時(shí)候還不是要從匿名內(nèi)部類寫(xiě)起?
那再用在點(diǎn)擊事件中開(kāi)啟一個(gè)線程的:
一般寫(xiě)法
button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) { new Thread(new Runnable() { @Override public void run() { } }); } });
看起來(lái)是不是有點(diǎn)眼花繚亂,很明顯的onClick等方法有點(diǎn)搶鏡,讓run方法不是那么容易被發(fā)現(xiàn);
Lambda表達(dá)式
button.setOnClickListener( view-> new Thread(() -> { }));
怎么樣,是不是被驚艷到了,服不服??Lambda就是這么簡(jiǎn)潔,簡(jiǎn)潔到?jīng)]朋友。
可能有朋友就奇怪怎么寫(xiě)一起了,不該是兩個(gè)分開(kāi)的Lambda表達(dá)式嗎?
button.setOnClickListener(view -> { new Thread(() -> { }); });
帶著這個(gè)疑問(wèn)我們從源頭找起,來(lái)看看Lambda表達(dá)式到底簡(jiǎn)化了什么?
從上面我們不難發(fā)現(xiàn),Lambda表達(dá)式的簡(jiǎn)化,其實(shí)是簡(jiǎn)化了接口的匿名內(nèi)部類的實(shí)現(xiàn):
//一般寫(xiě)法 View.OnClickListener listener=new View.OnClickListener() { @Override public void onClick(View view) { } }; //Lambda表達(dá)式 View.OnClickListener listener= view -> { };
我們發(fā)現(xiàn)Lambda簡(jiǎn)化了OnClickListener這個(gè)接口的匿名實(shí)現(xiàn)和一個(gè)必須實(shí)現(xiàn)的方法,只留下一個(gè)參數(shù)。
那么 現(xiàn)在我們有了如下疑問(wèn)?
Lambda表達(dá)式只能簡(jiǎn)化接口的匿名實(shí)現(xiàn)嗎?
Lambda表達(dá)式能簡(jiǎn)化多個(gè)方法的接口的匿名實(shí)現(xiàn)嗎?
Lambda表達(dá)式能簡(jiǎn)化方法里有多個(gè)參數(shù)的接口嗎?
Lambda表達(dá)式能簡(jiǎn)化方法帶有返回值的接口嗎?
下面來(lái)一一解答:
Lambda表達(dá)式只能簡(jiǎn)化接口的匿名實(shí)現(xiàn)嗎?
答案是肯定的。
就目前而言Lambda表達(dá)式只能簡(jiǎn)化接口的匿名內(nèi)部類實(shí)現(xiàn)。
原因大概是:接口是沒(méi)有構(gòu)造方法,而抽象類和一般的類是有構(gòu)造方法的;接口里的方法沒(méi)有方法體等等。因?yàn)榻涌诘奶厥庑?,Lambda表達(dá)式就是只針對(duì)接口而已。
Lambda表達(dá)式能簡(jiǎn)化多個(gè)方法的接口的匿名實(shí)現(xiàn)嗎?
答案是不能:這里從Lambda的表達(dá)式就可以看出來(lái),已經(jīng)簡(jiǎn)化到?jīng)]有沒(méi)有一絲多余的代碼,多個(gè)方法怎么寫(xiě)呢。
Lambda只能簡(jiǎn)化單一方法接口的匿名內(nèi)部類實(shí)現(xiàn);
Lambda表達(dá)式能簡(jiǎn)化多個(gè)參數(shù)的單一方法接口嗎?
這個(gè)答案是肯定的。
前面我在例子中已經(jīng)用到了沒(méi)有參數(shù)和一個(gè)參數(shù)的接口匿名實(shí)現(xiàn)。
沒(méi)有參數(shù)一個(gè)空的小括號(hào);
一個(gè)參數(shù)在括號(hào)里面添加一個(gè)參數(shù),
多個(gè)參數(shù)就直接添加就OK了;
一個(gè)參數(shù)時(shí)小括號(hào)是可以省略的;
另外參數(shù)類型是可以省略的,當(dāng)然也就可以寫(xiě)的;
省略括號(hào)時(shí)是不能寫(xiě)參數(shù)類型的。
//沒(méi)有參數(shù) Runnable runnable=() -> { }; //一個(gè)參數(shù) View.OnClickListener listener= (View view) -> { }; View.OnClickListener listener= (view) -> { //參數(shù)類型可省略 }; View.OnClickListener listener= view -> { //括號(hào)可省略,但不能添加參數(shù) }; //兩個(gè)參數(shù) public interface JackListener{ void check(String string,String check); }; doWhat("jack666", (string, check) -> { //這里的兩個(gè)參數(shù)指的是接口里方法的參數(shù),而不是doWhat的參數(shù)哦 });
Lambda表達(dá)式能簡(jiǎn)化方法帶有返回值的接口嗎?
答案是肯定的,其實(shí)返回值和簡(jiǎn)化前的寫(xiě)法是一樣,return一下就可以了。示例如下;
//兩個(gè)參數(shù) public interface JackListener{ boolean check(String string,String check); }; doWhat("jack666", (string, check) -> { boolean result=string.contains(check); Toast.makeText(MainActivity.this, ""+result, Toast.LENGTH_SHORT).show(); return result; });
現(xiàn)在咱們?cè)賮?lái)看看前面的兩個(gè)Lambda嵌套時(shí)發(fā)生了化學(xué)反應(yīng):
button.setOnClickListener(view -> { new Thread(() -> { }); }); //兩個(gè)Lambda表達(dá)式嵌套,極簡(jiǎn)模式 button.setOnClickListener( view-> new Thread(() -> { //前提是Lambda表達(dá)式中的方法體內(nèi)部只有一個(gè)單純Lambda表達(dá)式 })); //四個(gè)Lambda表達(dá)式嵌套,CRAZY!!! button.setOnClickListener(view -> new Thread(() -> button.setOnClickListener(view1 -> new Thread(() -> { }))));
從Lambda表達(dá)式開(kāi)始等于開(kāi)啟了Java的極簡(jiǎn)模式,期待下個(gè)版本會(huì)有更多的簡(jiǎn)化,祝福Java在簡(jiǎn)化這條路上越走越遠(yuǎn),讓嘲笑Java臃腫的人去屎!
歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67773.html
摘要:上一篇小樂(lè)介紹了新特性函數(shù)式接口,大家可以點(diǎn)擊回顧。中引入方法引用新特性用于簡(jiǎn)化應(yīng)用對(duì)象方法的調(diào)用,方法引用是用來(lái)直接訪問(wèn)類或者實(shí)例的已經(jīng)存在的方法或者構(gòu)造方法。方法引用是一種更簡(jiǎn)潔易懂的表達(dá)式。 上一篇小樂(lè)介紹了《Java8新特性-函數(shù)式接口》,大家可以點(diǎn)擊回顧。這篇文章將接著介紹Java8新特性之方法引用。 Java8 中引入方法引用新特性,用于簡(jiǎn)化應(yīng)用對(duì)象方法的調(diào)用,?方法引用是...
摘要:很多語(yǔ)言等從設(shè)計(jì)之初就支持表達(dá)式。注意此時(shí)外部局部變量將自動(dòng)變?yōu)樽鳛榉椒ǚ祷刂道臃祷嘏袛嘧址欠駷榭张袛嘧址欠駷榭战裉礻P(guān)于新特性表達(dá)式就講到這里了,接下來(lái)我會(huì)繼續(xù)講述新特性之函數(shù)式接口。 上一篇文章我們了解了Java8新特性-接口默認(rèn)方法,接下來(lái)我們聊一聊Java8新特性之Lambda表達(dá)式。 Lambda表達(dá)式(也稱為閉包),它允許我們將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼...
摘要:大家好,我是樂(lè)字節(jié)的小樂(lè),上一次我們說(shuō)到了核心特性之函數(shù)式接口,接下來(lái)我們繼續(xù)了解又一核心特性方法引用。方法引用是一種更簡(jiǎn)潔易懂的表達(dá)式。感謝光臨閱讀小樂(lè)的,敬請(qǐng)關(guān)注樂(lè)字節(jié)后續(xù)將繼續(xù)講述等前沿知識(shí)技術(shù)。 大家好,我是樂(lè)字節(jié)的小樂(lè),上一次我們說(shuō)到了Java8核心特性之函數(shù)式接口,接下來(lái)我們繼續(xù)了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...
摘要:歐陽(yáng)思海繼承接口后,又加了新的抽象方法,這個(gè)接口就不再是函數(shù)式接口默認(rèn)方法在接口中添加了一個(gè)默認(rèn)方法。總結(jié)在這篇文章中,我們講了表達(dá)式方法引用函數(shù)式接口接口中的靜態(tài)方法接口中的默認(rèn)方法的使用。 今天我來(lái)聊聊 Java8 的一些新的特性,確實(shí) Java8 的新特性的出現(xiàn),給開(kāi)發(fā)者帶來(lái)了非常大的便利,可能剛剛開(kāi)始的時(shí)候會(huì)有點(diǎn)不習(xí)慣的這種寫(xiě)法,但是,當(dāng)你真正的熟悉了之后,你一定會(huì)愛(ài)上這些新的...
摘要:上一篇小樂(lè)帶大家學(xué)過(guò)新特性表達(dá)式,什么時(shí)候可以使用通常表達(dá)式是用在函數(shù)式接口上使用的。使用實(shí)現(xiàn)創(chuàng)建產(chǎn)生一個(gè)工廠對(duì)象以上就是小樂(lè)帶給大家的新特性之函數(shù)式接口,下一篇將會(huì)為大家?guī)?lái)新特性之方法引用,敬請(qǐng)關(guān)注。 上一篇小樂(lè)帶大家學(xué)過(guò) Java8新特性-Lambda表達(dá)式,什么時(shí)候可以使用Lambda?通常Lambda表達(dá)式是用在函數(shù)式接口上使用的。從Java8開(kāi)始引入了函數(shù)式接口,其說(shuō)明比較...
閱讀 2729·2021-10-11 10:58
閱讀 1324·2021-09-29 09:34
閱讀 1746·2021-09-26 09:46
閱讀 3992·2021-09-22 15:31
閱讀 859·2019-08-30 15:54
閱讀 1596·2019-08-30 13:20
閱讀 1375·2019-08-30 13:13
閱讀 1680·2019-08-26 13:52