lambda的使用

目錄結構:

1:怎么在studio中使用lambda表達式;
2:lambda表達式的使用;

1:怎么在studio中使用lambda表達式

怎么在Android studio項目里面使用java 8的新特性功能lambda表達式呢?
google developer 官方文檔里面提供了3種方法:

方法

前提使用JAVA 8
1:使用jack工具鏈;
jack方式
配置 Gradle
要為您的項目啟用 Java 8 語言功能和 Jack匠抗,請在模塊級別的 build.gradle 文件中輸入以下內(nèi)容:

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Instant Run 目前不能用于 Jack鹉梨,在使用新的工具鏈時將被停用,所以不建議使用這種方式.
2:使用 Retrolambda插件

配置Gradel
要為您的項目啟用 Java 8 語言功能和 retrolambda京革,請在模塊級別的 build.gradle 文件中輸入以下內(nèi)容:

android {
    ...
    defaultConfig {
        ...
    }

    // Keep the following configuration in order to target Java 8.
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
apply plugin: 'me.tatarka.retrolambda'

不明白的細節(jié)可以看官方文檔

buildscript {
  ...
   dependencies {
      classpath 'me.tatarka:gradle-retrolambda:<version_number>'
   }
}

gradle-retrolambda版本選擇
gradle-retrolambda官方文檔

3:
前面兩種是使用插件完成,第三種,看google文檔中寫到,Android studio 3.0 preview 1之后,可以不適用工具鏈插件. 明確指出禁用jack工具鏈.
前提
To start using supported Java 8 language features, update the Android plugin to 3.0.0-alpha1
(or higher) and add the following to your module’sbuild.gradle
file:
這里的這個plugin 3.0.0-alpha1 不知道怎么搞.等回頭試過了更新此部分.

// Keep the following configuration in order to target Java 8.
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

目前推薦使用gradle-retrolambda插件的這種方式.

2:lambda表達式的使用

lambda 表達式有三種形式,分別是:
a:函數(shù)式接口
b:方法引用
c:構造器引用

Lambda 表達式由參數(shù)列表叛薯、箭頭和 Lambda 主體(語句塊)組成奶是。
( 參數(shù)列表... ) -> { 語句塊... }

lambda表達式 含義
(String s) -> s.length() 表達式具有一個 String 類型的參數(shù)并返回一個 int复旬。 Lambda 沒有 return 語句慨飘,因為已經(jīng)隱含的 return某残,可以顯示調(diào)用 return代咸。
(T t) -> R 傳入?yún)?shù)T,返回一個R類型
(T t) -> void 傳入?yún)?shù)T,不返回任何內(nèi)容
(T1 t,T2 t2,...) -> R 傳入多個參數(shù),返回一個R類型
(T1 t,T2 t2,...) -> void 傳入多個參數(shù),不返回任何內(nèi)容

使用lambda表達式的前提是:一個只定義了一個抽象方法的接口,或抽象類.

函數(shù)式接口

函數(shù)式接口的使用

方法引用

以 Java 的 Predicate 接口作為示例蹈丸,此接口用來實現(xiàn)判斷功能,我們來對字符串進行全面的判空操作:


原始用法

TextUtils 的 isEmpty() 方法實現(xiàn)了上述功能,所以我們可以寫作:

方法引用

方法引用形式就是當邏輯實現(xiàn)只有一句且調(diào)用了已存在的方法進行處理( this 和 super 的方法也可包括在內(nèi))時逻杖,對函數(shù)式接口形式的 lambda 表達式進行進一步的簡化奋岁。傳入引用方法的參數(shù)就是原接口方法的參數(shù)。

接下來總結一下方法引用形式的三種格式:

object :: instanceMethod

直接調(diào)用任意對象的實例方法荸百,如 obj::equals 代表調(diào)用 obj 的 equals 方法與接口方法參數(shù)比較是否相等闻伶,效果等同 obj.equals(t);。

ClassName :: staticMethod

當前類的方法可用this::method進行調(diào)用够话,父類方法同理虾攻。
直接調(diào)用某類的靜態(tài)方法,并將接口方法參數(shù)傳入更鲁,如上述 TextUtils::isEmpty霎箍,效果等同 TextUtils.isEmpty(s);

ClassName :: instanceMethod

較為特殊,將接口方法參數(shù)列表的第一個參數(shù)作為方法調(diào)用者,其余參數(shù)作為方法參數(shù)澡为。由于此類接口較少漂坏,故選擇 Java 提供的 BiFunction 接口作為示例,該接口方法接收一個 T1 類對象和一個 T2 類對象媒至,通過處理后返回 R 類對象

方法引用2

值得注意的是方法引用圖2中的這種方式,固定第一個參數(shù)作為方法調(diào)用者,其他參數(shù)作為方法參數(shù)

構造器引用

對于一個現(xiàn)有構造函數(shù)顶别,可以利用它的名稱和關鍵字 new 來創(chuàng)建它的一個引用:ClassName::new。它的功能與指向靜態(tài)方法的引用類似拒啰。

例如驯绎,假設有一個構造函數(shù)沒有參數(shù)。 它適合 Supplier 的簽名() -> Apple谋旦∈JВ可以這樣做:

Supplier<Apple> c1 = Apple::new; //構造函數(shù)引用指向默認的 Apple() 構造函數(shù)
Apple a1 = c1.get(); //產(chǎn)生一個新的對象

//等價于:

Supplier<Apple> c1 = () -> new Apple(); //利用默認構造函數(shù)創(chuàng)建 Apple 的 Lambda 表達式
Apple a1 = c1.get();

Supplier接口

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

如果你的構造函數(shù)的簽名是Apple(Integer weight),那么它就適合 Function 接口的簽名册着,于是可以這樣寫:

Function<Integer, Apple> c2 = Apple::new; //構造函數(shù)引用指向 Apple(Integer weight) 構造函數(shù)
Apple a2 = c2.apple(100);

//等價于:

Function<Integer, Apple> c2 = (Integer weight) -> new Apple(weight);
Apple a2 = c2.apple(100);

類型檢查

Lambda 的類型是從使用 Lambda 的上下文推斷出來的拴孤。上下文(比如接受它傳遞的方法的參數(shù),或接受它的值的局部變量)中 Lambda 表達式需要的類型稱為目標類型甲捏。下圖表示了代碼的類型檢查過程:

類型檢查

首先演熟,找出 filter 方法的聲明;
第二司顿,找出目標類型 Predicate<Apple>芒粹。
第三,Predicate<Apple>是一個函數(shù)式接口大溜,定義了一個叫作 test 的抽象方法化漆。
第四,test 方法描述了一個函數(shù)描述符猎提,它可以接受一個 Apple获三,并返回一個 boolean旁蔼。
最后,filter 的任何實際參數(shù)都必須匹配這個要求疙教。

搬東搬西湊成了這篇筆記,時不時自己好回憶下.

參考鏈接

1:lambda 簡書

2:郭神公眾號

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棺聊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贞谓,更是在濱河造成了極大的恐慌限佩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裸弦,死亡現(xiàn)場離奇詭異祟同,居然都是意外死亡,警方通過查閱死者的電腦和手機理疙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門晕城,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窖贤,你說我怎么就攤上這事砖顷。” “怎么了赃梧?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵滤蝠,是天一觀的道長。 經(jīng)常有香客問我授嘀,道長物咳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任蹄皱,我火速辦了婚禮览闰,結果婚禮上,老公的妹妹穿的比我還像新娘夯接。我一直安慰自己焕济,他們只是感情好纷妆,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布盔几。 她就那樣靜靜地躺著,像睡著了一般掩幢。 火紅的嫁衣襯著肌膚如雪逊拍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天际邻,我揣著相機與錄音芯丧,去河邊找鬼。 笑死世曾,一個胖子當著我的面吹牛缨恒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼骗露,長吁一口氣:“原來是場噩夢啊……” “哼岭佳!你這毒婦竟也來了?” 一聲冷哼從身側響起萧锉,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤珊随,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柿隙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叶洞,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年禀崖,在試婚紗的時候發(fā)現(xiàn)自己被綠了衩辟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡波附,死狀恐怖惭婿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叶雹,我是刑警寧澤财饥,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站折晦,受9級特大地震影響钥星,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜满着,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一谦炒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧风喇,春花似錦宁改、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耙考,卻和暖如春谜喊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倦始。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工斗遏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鞋邑。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓诵次,卻偏偏與公主長得像账蓉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逾一,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容