品一杯咖啡解決Java8之lambda表達式

smile

逛帖子的時候偶爾發(fā)現(xiàn)了一篇lambda很容易入門的帖子,轉載于30分鐘入門Java8之lambda表達式

前言

Google在今年發(fā)布Android N開發(fā)者預覽版耐齐,一并宣布開始支持Java 8。我們終于能在Android開發(fā)中使用到Java8的一些語言特性了。目前支持:

  • 默認方法
  • lambda表達式
  • 多次注解

今天我們就簡要學習lambda表達式。

配置開發(fā)環(huán)境

首先需要下載安裝JDK1.8
如果想在Android開發(fā)中使用lambda表達式萧落,需要在Android Studio中配置Java 8開發(fā)環(huán)境怎虫。
配置appGradle文件,不是ProjectGradle:

  • 開啟jack編譯選項
  • 設置編譯選項兼容到1.8
android {
    defaultConfig {
        ...
        //開啟jack編譯
        jackOptions {
            enabled true
        }
    }
   ...
   //將編譯選項設置為Java1.8
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

出于種種原因茴丰,可能我們使用的JDK版本是1.7甚至更低,但是我們又想學習使用lambda表達式姐刁,怎么辦呢芥牌?Github上已經有開發(fā)者設計了兼容lambda表達式到Java7,6聂使,5的開源庫retrolamda壁拉。至于如何在Android Studio中配置,在此就不啰嗦了柏靶∑恚可以參看Gradle Retrolambda Plugin

第一個lambda表達式

看到下面的代碼屎蜓,相信大家都會非常熟悉痘昌。這不就是給button設置監(jiān)聽事件嘛。

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("TAG","按鈕被點擊,匿名內部類");
            }
        });

分析上面的代碼炬转,這是通過匿名內部類來設置Button的點擊監(jiān)聽事件的辆苔。也就是說,我們創(chuàng)建了一個實現(xiàn)了View.OnClickListener
接口的匿名類的對象扼劈。匿名內部類實現(xiàn)了onClick
方法驻啤。通過這個匿名類的對象,我們在用戶點擊按鈕時荐吵,打印出日志骑冗。
可是,大家有沒有發(fā)現(xiàn)捍靠。上面那段代碼沐旨,真正有用的就是Log.d("TAG","按鈕被點擊,匿名內部類");
這一行代碼森逮,這就反映了使用匿名內部類的缺點:

  • 可讀性差榨婆,不能直接明了的體現(xiàn)我們的意圖。
  • 啰嗦褒侧,一行邏輯代碼卻有幾行模板代碼良风。

而lambda表達式很好的解決了這些問題:

button.setOnClickListener(view-> Log.d(TAG,"按鈕被點擊,lambda表達式"));

view-> Log.d(TAG,"按鈕被點擊,lambda表達式"));就是我們寫的第一個lambda表達式谊迄。

lambda表達式通常以(argument)->(body)這樣的格式書寫。

//省略參數類型
(arg1,arg2...) -> {body}

//指定參數類型
(Type1 arg1,Type2 arg2...)->{body}

lambda表達式中烟央,參數的類型可省略统诺。Java編譯器根據表達式的上下文推導出參數的類型。就像上面圖中view的類型是View疑俭。

lambda表達式的結構

  • 參數可以是零個或多個
  • 參數類型可指定粮呢,可省略(根據表達式上下文推斷)
  • 參數包含在圓括號中,用逗號分隔
  • 表達式主體可以是零條或多條語句,包含在花括號中
  • 表達式主體只有一條語句時,花括號可省略
  • 表達式主體有一條以上語句時钞艇,表達式的返回類型與代碼塊的返回類型一致
  • 表達式只有一條語句時啄寡,表達式的返回類型與該語句的返回類型一致
//零個
 ()-> System.out.println("no argument");
 
//一個
  x->x+1

//兩個
  (x,y)->x+y

//省略參數類型
 View.OnClickListener oneArgument = view->Log.d(TAG,"one argument");
 //指定參數類型
 View.OnClickListener oneArgument = (View view)->Log.d(TAG,"one argument");

//多行語句
//返回類型是代碼塊返回的void
View.OnClickListener multiLine = (View view)->{
      Log.d(TAG,"multi statements");
      Log.d(TAG,"second line");
}

//返回類型是表達式主體語句的返回類型int
(int x)->x+1

lambda表達式的類型

我們都知道,Java是一種強類型語言哩照。所有的方法參數都有類型挺物,那么lambda表達式是一種什么類型呢?

 View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //...
            }
        };
        
 button.setOnClickListener(listener);

如上所示飘弧,以往我們是通過使用單一方法的接口來代表一個方法并且重用它识藤。
在lambda表達式中,仍使用的和之前一樣的形式次伶。我們叫做函數式接口(functional interface)
如我們之前button的點擊響應事件使用的View.OnClickListener
就是一個函數式接口痴昧。

public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {
        ...
 public interface OnClickListener {
        void onClick(View v);
    }
    ...
    }

那究竟什么樣的接口是函數式接口呢?

函數式接口是只有一個抽象方法的接口冠王。用作表示lambda表達式的類型剪个。

Java8 API中新增了許多函數式接口:

接口名 參數 返回值 用途
Predicate T boolean 斷言
Consumer T void 消費
Function T R 函數
Function T R 函數
Supplier None T 工程方法
UnaryOperator T T 邏輯非
BinaryOperator (T,T) T 二元操作

想學習java8更多技術的童鞋可以看看下面這些文章:
深入理解Java 8 Lambda(語言篇——lambda,方法引用版确,目標類型和默認方法)

30 分鐘 Java Lambda 入門教程

Java8 lambda表達式10個示例

Java8特性詳解 lambda表達式 Stream

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末扣囊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绒疗,更是在濱河造成了極大的恐慌侵歇,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吓蘑,死亡現(xiàn)場離奇詭異惕虑,居然都是意外死亡,警方通過查閱死者的電腦和手機磨镶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門溃蔫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琳猫,你說我怎么就攤上這事伟叛。” “怎么了脐嫂?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵统刮,是天一觀的道長紊遵。 經常有香客問我,道長侥蒙,這世上最難降的妖魔是什么暗膜? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鞭衩,結果婚禮上学搜,老公的妹妹穿的比我還像新娘。我一直安慰自己论衍,他們只是感情好恒水,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饲齐,像睡著了一般钉凌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捂人,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天御雕,我揣著相機與錄音,去河邊找鬼滥搭。 笑死酸纲,一個胖子當著我的面吹牛,可吹牛的內容都是我干的瑟匆。 我是一名探鬼主播闽坡,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼愁溜!你這毒婦竟也來了疾嗅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤冕象,失蹤者是張志新(化名)和其女友劉穎代承,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體渐扮,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡论悴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了墓律。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膀估。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耻讽,靈堂內的尸體忽然破棺而出察纯,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布捐寥,位于F島的核電站笤昨,受9級特大地震影響祖驱,放射性物質發(fā)生泄漏握恳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一捺僻、第九天 我趴在偏房一處隱蔽的房頂上張望乡洼。 院中可真熱鬧,春花似錦匕坯、人聲如沸束昵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锹雏。三九已至,卻和暖如春术奖,著一層夾襖步出監(jiān)牢的瞬間礁遵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工采记, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留佣耐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓唧龄,卻偏偏與公主長得像兼砖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子既棺,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容