好程序員分享java8新特性之Lambda表達(dá)式
?、Lambda表達(dá)式簡(jiǎn)介
什么是Lambda?
Lambda表達(dá)式是Java 8推出的?個(gè)新特性。從本質(zhì)上講,Lambda表達(dá)式是?個(gè)匿名函數(shù)。
為什么要使?Lambda?
使?Lambda表達(dá)式可以對(duì)?個(gè)接?進(jìn)??常簡(jiǎn)潔的實(shí)現(xiàn)。
之前我們?cè)诮o?個(gè)接?引?賦值的時(shí)候,可以使?接?實(shí)現(xiàn)類,或者匿名內(nèi)部類。但是有了
Lambda表達(dá)式,我們可以更加?便的實(shí)現(xiàn)這個(gè)需求。
interface Comparator<T>?{
int compare(T o1, T o2);
}
class Program?{
public static void main(String[] args) {
// 1. 使?接?實(shí)現(xiàn)類實(shí)現(xiàn)
class Impl implements Comparator<Integer>?{
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
}
Comparator<Integer> c1 = new Impl();
// 2. 使?匿名內(nèi)部類實(shí)現(xiàn)
Comparator<Integer> c2 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
// 3. 使?Lambda表達(dá)式實(shí)現(xiàn)
Comparator<Integer> c3 =?(o1, o2) -> o1 - o2;
}
}
從上述例?中,我們可以看到: 對(duì)同樣?個(gè)接?引?的實(shí)現(xiàn),Lambda最簡(jiǎn)單!
Lambda對(duì)接?的要求?雖然Lambda表達(dá)式可以很便捷的實(shí)現(xiàn)接?,但并不是所有的接?都可以使?Lambda表達(dá)式來(lái)實(shí)現(xiàn)。
可以?Lambda表達(dá)式來(lái)簡(jiǎn)潔實(shí)現(xiàn)的接?是有要求的。因?yàn)長(zhǎng)ambda表達(dá)式本質(zhì)上來(lái)講,就是?個(gè)匿名
函數(shù),?這個(gè)匿名函數(shù)來(lái)實(shí)現(xiàn)接?中的?法。所以,如果接?中有多個(gè)必須要實(shí)現(xiàn)抽象?法時(shí),
Lambda表達(dá)式將?法是?。
注:Lambda表達(dá)式要求接?中只有?個(gè)必須要實(shí)現(xiàn)的抽象?法。但是JAVA 8對(duì)接?也有?個(gè)
拓展?,F(xiàn)在,我們可以在接?中,是?default來(lái)修飾?個(gè)?法,此時(shí),這個(gè)?法需要有實(shí)
現(xiàn)。那么,實(shí)現(xiàn)類在實(shí)現(xiàn)接?的時(shí)候,對(duì)于default?法,可以實(shí)現(xiàn),也可以不實(shí)現(xiàn)。所以,
這?所說(shuō)的接?中只有?個(gè)必須實(shí)現(xiàn)的抽象?法,與default?法?關(guān)。
@FunctionalInterface**
@FunctionalInterface
因?yàn)長(zhǎng)ambda表達(dá)式要求接?中有且只能有?個(gè)必須實(shí)現(xiàn)的抽象?法,所以,對(duì)接?可以使?
@FunctionalInterface接?來(lái)進(jìn)?限定。這個(gè)注解約束了接?中只能有?個(gè)必須實(shí)現(xiàn)的抽象?
法。使?這個(gè)注解修飾的接?,?叫做函數(shù)式接?。
?、Lambda表達(dá)式基礎(chǔ)語(yǔ)法
Lambda表達(dá)式,本質(zhì)上就是?個(gè)匿名?法,所以離不開(kāi)?法的?個(gè)必要的組成部分:返回值、?法
名、參數(shù)、?法體。但是由于他是?個(gè)匿名?法,所以?法名可以忽略。同時(shí),Lambda中也不需要
顯式聲明返回值類型。所以,我們?cè)趯?xiě)Lambda表達(dá)式的時(shí)候,只需要關(guān)?參數(shù)和?法體即可。
參數(shù): 以()包圍起來(lái),多個(gè)參數(shù)以逗號(hào)分隔
(int a, int b)
?法體: 以{}包圍起來(lái)
{ System.out.println("hello world"); }
->:?Lambda運(yùn)算符,?來(lái)分隔參數(shù)和?法體
(int a, int b) -> {};
有了這?個(gè)組成部分,我們就可以對(duì)任意的函數(shù)式接?使?Lambda進(jìn)?實(shí)現(xiàn)
// ?參、?返回值
() ->?{ System.out.println("hello world"); };
// int, int參數(shù)、?返回值
(int a, int b) ->?{ System.out.println(a + b); };
// int, int參數(shù)、int返回值
(int a, int b) ->?{ return a + b; };
三、Lambda表達(dá)式語(yǔ)法精簡(jiǎn)
接?中定義的?法,已經(jīng)聲明了?法的參數(shù)類型、數(shù)量和返回值類型。所以,使?Lambda表達(dá)式在
實(shí)現(xiàn)的時(shí)候,對(duì)應(yīng)的部分可以省略參數(shù)精簡(jiǎn)
(int a, int b) -> { System.out.println(a + b); }
可以精簡(jiǎn)為:
(a, b) -> { System.out.println(a + b); }
(int a) -> { System.out.println(a); }
可以精簡(jiǎn)為:
a -> { System.out.println(a); }
?法體精簡(jiǎn)
a -> { System.out.println(a); }
可以精簡(jiǎn)為:
a -> System.out.println(a);
a -> { return a * 2; }
可以精簡(jiǎn)為:
a -> a * 2;
四、Lambda表達(dá)式語(yǔ)法進(jìn)階之?法引?
什么是?法引?
如果在使?Lambda進(jìn)?接?實(shí)現(xiàn)的時(shí)候,需要實(shí)現(xiàn)的邏輯已經(jīng)在某?個(gè)?法中實(shí)現(xiàn),則可以直接使
??法引?,指向指定的?法。
interface Calculate?{
int calculate(int a, int b);
}
public class Program?{
public static void main(String[] args) {
// 接?引?
Calculate c =?(a, b) -> a + b;
}
public static int add(int a, int b) {
return a + b;
}
}在上述代碼中,main函數(shù)中Calculate引?c的實(shí)現(xiàn)部分,下?已經(jīng)有?個(gè)?法 add 進(jìn)?了實(shí)現(xiàn)。
所以此時(shí),我們不需要再實(shí)現(xiàn)?次,只需要直接指向已經(jīng)寫(xiě)好的實(shí)現(xiàn)即可。所以,可以進(jìn)?如下改
造:
Calculate c = Program::add;
上?的 Program::add 就是?個(gè)?法引?。引?了Program類中的?個(gè)靜態(tài)?法add。
在使??法引?的時(shí)候需要注意
引?的?法參數(shù)數(shù)量、參數(shù)類型、返回值類型必須和函數(shù)式接?中的?法定義?致。
類來(lái)調(diào)?。所以?法引?就是 類::?法,如果是?個(gè)成員?法,則需要使? 對(duì)象::?法 的
形式來(lái)引?。
構(gòu)造?法的引?
如果需要引??個(gè)構(gòu)造?法,需要使? 類::new 進(jìn)?引?
interface CreatePerson?{
Person getPerson();
}
class Person?{}
class Program?{
public static void main(String[] args) {
CreatePerson c = Person::new;
}
}
五、Lambda表達(dá)式之綜合案例: 排序Comparator
// 排序
list.sort((o1, o2) -> o2.age - o1.age);
// 使?Lambda表達(dá)式來(lái)實(shí)現(xiàn)Comparator接?,并實(shí)例化?個(gè)TreeSet對(duì)象
TreeSet<Person> set = new TreeSet<>((o1, o2) ->?{
if?(o1.age >= o2.age) {
return -1;
}
else?{
return 1;
}
});
六、Lambda表達(dá)式之綜合案例: forEach()// 將集合中的每?個(gè)元素都帶?到?法accept中。
list.forEach(System.out::println);
// 輸出集合中所有的偶數(shù)
list.forEach(ele ->?{
if?(ele % 2 == 0) {
System.out.println(ele);
}
});
七、Lambda表達(dá)式之綜合案例: removeIf()
// 將集合中的每?個(gè)元素都帶?到test?法中, 如果返回值是true,則刪除這個(gè)元素
// 刪除集合中的年齡?于10歲的元素
list.removeIf(ele -> ele.age > 10);
?、Lambda表達(dá)式之綜合案例: 線程實(shí)例化
new Thread(() ->?{
for?(int i = 0; i < 100; i++) {
System.out.println(i);
}
}).start();
九、系統(tǒng)內(nèi)置函數(shù)式接?
系統(tǒng)已經(jīng)給我們提供了很多函數(shù)式接?,?便我們的使?。因此,如果我們需要?到以下?法的時(shí)
候,不需要再設(shè)計(jì)接?,直接使?指定的接?即可。函數(shù)式接?
參
數(shù)
返回值 特殊說(shuō)明:?個(gè)特殊實(shí)現(xiàn)的?接?
Predicate T boolean
IntPredicate :參數(shù):int,返回值:boolean
LongPredicate :參數(shù):long,返回值:boolean
DoublePredicate :參數(shù):double,返回值:boolean
Consumer T void
IntConsumer :參數(shù):int,返回值:void LongConsumer :
參數(shù):int,返回值:void DoubleConsumer :參數(shù):int,返
回值:void
Function<T, R> T R
IntFunction<R> :參數(shù):int,返回值:R
IntToDoubleFunction :參數(shù):int,返回值:double
IntToLongFunction :參數(shù):int,返回值:long
LongFunction<R> :參數(shù):long,返回值:R
LongToDoubleFunction :參數(shù):long,返回值:double
LongToIntFunction :參數(shù):long,返回值:int
DoubleFunction<R> :參數(shù):double,返回值:R
DoubleToIntFunction :參數(shù):double,返回值:int
DoubleToLongFunction :參數(shù):double,返回值:long
Supplier ? T
BooleanSupplier :參數(shù):?,返回值:boolean
IntSupplier :參數(shù):?,返回值:int LongSupplier :參
數(shù):?,返回值:long DoubleSupplier :參數(shù):?,返回值:
double
UnaryOperator T T
IntUnaryOperator :參數(shù):int,返回值:int
LongUnaryOperator :參數(shù):long,返回值:long
DoubleUnaryOperator :參數(shù):double,返回值:double
BinaryOperator T,
T T
IntBinaryOperator :參數(shù):int, int,返回值:int
LongBinaryOperator :參數(shù):long, long,返回值:long
DoubleBinaryOperator :參數(shù):double, double,返回值:
double
BiPredicate<L,
R>
L,
R boolean
BiConsumer<T,
U>
T,
U void
BiFunction<T,
U, R>
T,
U R
上述接?中,最常?的是?Predicate、Consumer、
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買多久送多久。
網(wǎng)頁(yè)標(biāo)題:好程序員分享java8新特性之Lambda表達(dá)式-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article4/cspiie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、微信小程序、網(wǎng)站內(nèi)鏈、做網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容