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