30分鐘入門(mén)Java8之lambda表達(dá)式學(xué)習(xí)
前言
Google在今年發(fā)布Android N開(kāi)發(fā)者預(yù)覽版,一并宣布開(kāi)始支持Java 8。我們終于能在Android開(kāi)發(fā)中使用到Java8的一些語(yǔ)言特性了。目前支持:
- 默認(rèn)方法
- lambda表達(dá)式
- 多次注解
今天我們就簡(jiǎn)要學(xué)習(xí)lambda表達(dá)式。
配置開(kāi)發(fā)環(huán)境
首先需要下載安裝JDK1.8。
如果想在Android開(kāi)發(fā)中使用lambda表達(dá)式,需要在Android Studio中配置Java 8開(kāi)發(fā)環(huán)境。
配置app的Gradle文件:
- 開(kāi)啟jack編譯選項(xiàng)
- 設(shè)置編譯選項(xiàng)兼容到1.8
android {
defaultConfig {
...
//開(kāi)啟jack編譯
jackOptions {
enabled true
}
}
...
//將編譯選項(xiàng)設(shè)置為Java1.8
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
}
出于種種原因,可能我們使用的JDK版本是1.7甚至更低,但是我們又想學(xué)習(xí)使用lambda表達(dá)式,怎么辦呢?Github上已經(jīng)有開(kāi)發(fā)者設(shè)計(jì)了兼容lambda表達(dá)式到Java7,6,5的開(kāi)源庫(kù)retrolamda。至于如何在Android Studio中配置,在此就不啰嗦了??梢詤⒖?a target="_blank" rel="external nofollow" >Gradle Retrolambda Plugin。
第一個(gè)lambda表達(dá)式
看到下面的代碼,相信大家都會(huì)非常熟悉。這不就是給button設(shè)置監(jiān)聽(tīng)事件嘛。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG","按鈕被點(diǎn)擊,匿名內(nèi)部類(lèi)");
}
});
分析上面的代碼,這是通過(guò)匿名內(nèi)部類(lèi)來(lái)設(shè)置Button的點(diǎn)擊監(jiān)聽(tīng)事件的。也就是說(shuō),我們創(chuàng)建了一個(gè)實(shí)現(xiàn)了 View.OnClickListener 接口的匿名類(lèi)的對(duì)象。匿名內(nèi)部類(lèi)實(shí)現(xiàn)了 onClick 方法。通過(guò)這個(gè)匿名類(lèi)的對(duì)象,我們?cè)谟脩?hù)點(diǎn)擊按鈕時(shí),打印出日志。
可是,大家有沒(méi)有發(fā)現(xiàn)。上面那段代碼,真正有用的就是 Log.d("TAG","按鈕被點(diǎn)擊,匿名內(nèi)部類(lèi)"); 這一行代碼,這就反映了使用匿名內(nèi)部類(lèi)的缺點(diǎn):
- 可讀性差,不能直接明了的體現(xiàn)我們的意圖。
- 啰嗦,一行邏輯代碼卻有幾行模板代碼。
而lambda表達(dá)式很好的解決了這些問(wèn)題:
button.setOnClickListener(view-> Log.d(TAG,"按鈕被點(diǎn)擊,lambda表達(dá)式"));
view-> Log.d(TAG,"按鈕被點(diǎn)擊,lambda表達(dá)式")); 就是我們寫(xiě)的第一個(gè)lambda表達(dá)式。
lambda表達(dá)式通常以 (argument)->(body) 這樣的格式書(shū)寫(xiě)。
//省略參數(shù)類(lèi)型
(arg1,arg2...) -> {body}
//指定參數(shù)類(lèi)型
(Type1 arg1,Type2 arg2...)->{body}
lambda表達(dá)式中,參數(shù)的類(lèi)型可省略。Java編譯器根據(jù)表達(dá)式的上下文推導(dǎo)出參數(shù)的類(lèi)型。就像上面圖中 view 的類(lèi)型是 View 。
lambda表達(dá)式的結(jié)構(gòu)
- 參數(shù)可以是零個(gè)或多個(gè)
- 參數(shù)類(lèi)型可指定,可省略(根據(jù)表達(dá)式上下文推斷)
- 參數(shù)包含在圓括號(hào)中,用逗號(hào)分隔
- 表達(dá)式主體可以是零條或多條語(yǔ)句,包含在花括號(hào)中
- 表達(dá)式主體只有一條語(yǔ)句時(shí),花括號(hào)可省略
- 表達(dá)式主體有一條以上語(yǔ)句時(shí),表達(dá)式的返回類(lèi)型與代碼塊的返回類(lèi)型一致
- 表達(dá)式只有一條語(yǔ)句時(shí),表達(dá)式的返回類(lèi)型與該語(yǔ)句的返回類(lèi)型一致
//零個(gè)
()-> System.out.println("no argument");
//一個(gè)
x->x+1
//兩個(gè)
(x,y)->x+y
//省略參數(shù)類(lèi)型
View.OnClickListener oneArgument = view->Log.d(TAG,"one argument");
//指定參數(shù)類(lèi)型
View.OnClickListener oneArgument = (View view)->Log.d(TAG,"one argument");
//多行語(yǔ)句
//返回類(lèi)型是代碼塊返回的void
View.OnClickListener multiLine = (View view)->{
Log.d(TAG,"multi statements");
Log.d(TAG,"second line");
}
//返回類(lèi)型是表達(dá)式主體語(yǔ)句的返回類(lèi)型int
(int x)->x+1
lambda表達(dá)式的類(lèi)型
我們都知道,Java是一種強(qiáng)類(lèi)型語(yǔ)言。所有的方法參數(shù)都有類(lèi)型,那么lambda表達(dá)式是一種什么類(lèi)型呢?
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
//...
}
};
button.setOnClickListener(listener);
如上所示,以往我們是通過(guò)使用單一方法的接口來(lái)代表一個(gè)方法并且重用它。
在lambda表達(dá)式中,仍使用的和之前一樣的形式。我們叫做函數(shù)式接口(functional interface)
如我們之前button的點(diǎn)擊響應(yīng)事件使用的 View.OnClickListener 就是一個(gè)函數(shù)式接口。
public class View implements Drawable.Callback, KeyEvent.Callback,
AccessibilityEventSource {
...
public interface OnClickListener {
void onClick(View v);
}
...
}
那究竟什么樣的接口是函數(shù)式接口呢?
函數(shù)式接口是只有一個(gè)抽象方法的接口。用作表示lambda表達(dá)式的類(lèi)型。
Java8 API中新增了許多函數(shù)式接口:
| 接口名 | 參數(shù) | 返回值 | 用途 |
|---|---|---|---|
| Predicate |
T | boolean | 斷言 |
| Consumer |
T | void | 消費(fèi) |
| Function | T | R | 函數(shù) |
| Supplier |
None | T | 工廠(chǎng)方法 |
| UnaryOperator |
T | T | 邏輯非 |
| BinaryOperator |
(T,T) | T | 二元操作 |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java8新特性lambda表達(dá)式有什么用(用法實(shí)例)
- Java8新特性L(fǎng)ambda表達(dá)式的一些復(fù)雜用法總結(jié)
- Java8新特性之Lambda表達(dá)式淺析
- Java8中l(wèi)ambda表達(dá)式的應(yīng)用及一些泛型相關(guān)知識(shí)
- Java8 Lambda表達(dá)式詳解及實(shí)例
- Java8中的 Lambda表達(dá)式教程
- Java8與Scala中的Lambda表達(dá)式深入講解
- Java8中的lambda表達(dá)式入門(mén)教程
- Java8 新特性L(fǎng)ambda表達(dá)式實(shí)例詳解
- Java8中Lambda表達(dá)式的理解與應(yīng)用
相關(guān)文章
Java中實(shí)現(xiàn)兩個(gè)線(xiàn)程交替運(yùn)行的方法
這篇文章主要介紹了Java中實(shí)現(xiàn)兩個(gè)線(xiàn)程交替運(yùn)行的方法,本文將給大家分享操作流程,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
Spring中的@ConfigurationProperties在方法上的使用詳解
這篇文章主要介紹了Spring中的@ConfigurationProperties在方法上的使用詳解,@ConfigurationProperties應(yīng)該經(jīng)常被使用到,作用在類(lèi)上的時(shí)候,將該類(lèi)的屬性取值?與配置文件綁定,并生成配置bean對(duì)象,放入spring容器中,提供給其他地方使用,需要的朋友可以參考下2024-01-01
SpringBoot @FixMethodOrder 如何調(diào)整單元測(cè)試順序
這篇文章主要介紹了SpringBoot @FixMethodOrder 調(diào)整單元測(cè)試順序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
什么是Java多線(xiàn)程,如何實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于實(shí)現(xiàn)Java多線(xiàn)程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧吧2021-11-11
Java 數(shù)組轉(zhuǎn)List的四種方式小結(jié)
本文主要介紹了四種將Java數(shù)組轉(zhuǎn)換為L(zhǎng)ist的方法,包括使用Arrays.asList、ArrayList構(gòu)造器、Collections.addAll以及JDK8的Stream,具有一定的參考價(jià)值,感興趣的可以了解一下2024-10-10
SpringBoot整合RabbitMQ消息隊(duì)列的完整步驟
這篇文章主要給大家介紹了關(guān)于SpringBoot整合RabbitMQ消息隊(duì)列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

