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