前言
Java 8新特性早在2014年3月份就已經(jīng)發(fā)布了博杖,拿出來寫主要Android 底層的框架在用Java 8,并且比較穩(wěn)定,正如那句续担,我們不是追求技術(shù)的新,是追求技術(shù)的最穩(wěn)定活孩。Java 8 中最重要的兩個(gè)技術(shù)就是lambda 表達(dá)式物遇,和Stream API 。Stream APi 主要目的就是操作數(shù)據(jù)就像操作sql語句,可能 比sql語句還要簡單挎挖,不太了解可以參考上篇文章这敬,今天主要講解Lambda表達(dá)式。
一.Lambda表達(dá)式介紹
Lambda 是一個(gè) 匿名函數(shù)蕉朵,可以理解為可以傳遞的代碼(將代碼像數(shù)據(jù)一樣傳遞)崔涂,寫出來代碼更簡潔,更靈活始衅,更緊湊冷蚂。來看一個(gè)簡單的例子。
以前我們寫一個(gè)控件的點(diǎn)擊事件
mReactRootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GlobalMethod.showToast(WorkflowDetailActivity.this, "匿名內(nèi)部類");
}
});
但是jdk1.8后我們可以用Lambda表達(dá)式這么寫
mReactRootView.setOnClickListener(view -> GlobalMethod.showToast(WorkflowDetailActivity.this, "java8后"));
一行代碼就寫完了汛闸,很簡潔蝙茶,很緊湊,所以Java8 有一個(gè)很大的特點(diǎn)就就是代碼少了诸老,下面我們來主要要講解Lambda表達(dá)式語法隆夯。
二.Lambda表達(dá)式組成
Java 8 引入了一個(gè)新的操作符“->” 箭頭操作符或lambda操作符
lambda操作符 拆分成左右兩部分
左側(cè):表達(dá)式參數(shù)列表 (接口中抽象方法的參數(shù)列表)
右側(cè):表達(dá)式所需執(zhí)行的功能 也叫l(wèi)ambda 體 (實(shí)現(xiàn)的功能)
三.Lambda表達(dá)式語法
語法格式一:無參數(shù),無返回值
()->toast(“hello lambda”);
int a = 0;//jdk1.7之前必須是final才可能在內(nèi)部類中使用 1.8之后可以省略不寫(內(nèi)部幫我們加上)
//1.之前寫法
Runnable runnable = new Runnable() {
@Override
public void run() {
GlobalMethod.showToast(WorkflowDetailActivity.this, "匿名內(nèi)部類" + a);
}
};
//2.Lambda表達(dá)式寫法
Runnable runnable1 = () -> GlobalMethod.showToast(WorkflowDetailActivity.this, "匿名內(nèi)部類");
語法格式二:有一個(gè)參數(shù)别伏,無返回值
(X)->toast(“X”);
//1.有一個(gè)參數(shù)蹄衷,無返回值
mReactRootView.setOnClickListener((view) -> GlobalMethod.showToast(WorkflowDetailActivity.this, "java8后"));
語法格式三:有一個(gè)參數(shù)參數(shù)的小括號(hào)可以省略不寫,無返回值
X->toast(“X”);
//1.有一個(gè)參數(shù)厘肮,()可以省略
mReactRootView.setOnClickListener(view -> GlobalMethod.showToast(WorkflowDetailActivity.this, "java8后"));
語法格式四:有多個(gè)參數(shù)參數(shù)愧口,Lambda體中有多條語句,有返回值
(x,y)->{ toast(“X”); return x}
語法格式五:有多個(gè)參數(shù)參數(shù)类茂,lambda體中有一條語句耍属,有返回值,return和{} 都可以省略不寫
(x,y)->x;
語法格式六:數(shù)據(jù)類型可以省略不寫巩检,jvm的編譯器通過上下文推斷出數(shù)據(jù)類型厚骗,稱之為“類型推斷”就像 String[] str={“aa”,”bb”,”cc”};
(x,y)->x;
四.函數(shù)式接口
Lambda表達(dá)式需要函數(shù)式接口的支持 ,那什么是函數(shù)式接口呢
函數(shù)式接口:接口中只有一個(gè)抽象方法,可以使用注解@FuntionalInterface 修飾:可以檢查是否是函數(shù)式接口
@FunctionalInterface
interface test {
public void aa();
}
有了注解如果我們?cè)俣鄬懸粋€(gè)抽象方法就會(huì)報(bào)錯(cuò)兢哭,想想如果一個(gè)接口里面有多個(gè)抽象方法领舰,那用Lambda表達(dá)式 都不知道要重寫的是哪個(gè)方法,所以用Lambda表達(dá)式實(shí)現(xiàn)的接口中必須只有一個(gè)抽象方法
總結(jié)
Lambda 表達(dá)式主要是幫我們寫匿名內(nèi)部類的時(shí)候代碼簡潔厦瓢,而且方便提揍,主要就是語法和以前不同,有一個(gè)小口訣可以幫助我們加深記憶煮仇。
上聯(lián):左右遇一括號(hào)省
下聯(lián):左側(cè)推斷類型省
橫批:能省則省