一集峦、概述
????面向?qū)ο笏枷腙P(guān)注用什么對象完成什么事情。而函數(shù)式編程思想就類似數(shù)學(xué)中的函數(shù)抠刺。它關(guān)注的是對數(shù)據(jù)進(jìn)行了說明操作塔淤。(類似把具體的操作代碼通過參數(shù)的形式傳遞進(jìn)去)
????1、代碼簡潔速妖、接近自然語言高蜂;
????2、越來越多的非關(guān)系型數(shù)據(jù)庫應(yīng)用罕容,大數(shù)據(jù)量下處理集合十分高效方便备恤;
????3、易于并發(fā)編程锦秒;
二露泊、Lambda表達(dá)式
????jdk8的其中一個語法,函數(shù)式思想的一個重要體現(xiàn)旅择,核心原則:可推導(dǎo)可省略
????1惭笑、如果匿名內(nèi)部類是一個結(jié)果,并且只有一個抽象方法需要實(shí)現(xiàn),(例如起一個Thread)則可以修改為lambda表達(dá)式沉噩;
????2捺宗、只關(guān)注參數(shù)和函數(shù)體,idea可以使用alt+回車可以幫助智能轉(zhuǎn)換成lambda表達(dá)式
????3川蒙、省略規(guī)則
????????參數(shù)類型可以省略
????????方法體中只有一句代碼時(shí)大括號return和唯一一句代碼的分號可以省略
????????方法只有一個參數(shù)時(shí)小括號可以省略
三蚜厉、Stream流
????????對集合或數(shù)組進(jìn)行操作,不會影響原數(shù)據(jù)(我們在流中可以處理很多數(shù)據(jù)派歌,但是正常情況下是不會影響到原來集合中的元素的弯囊。
????????流代碼分為三步:
????????1、創(chuàng)建流
????????2胶果、中間操作
? ??????????filter map distinct sorted limit skip flatmap
????????????map()方法中的第一個泛型不能改(第一個類型就是對象的元素,已經(jīng)是定義好的,不能修改不然會報(bào)錯),但是第二個泛型是可以修改的(可以修改為想要的數(shù)據(jù)類型),簡單理解為就是把流當(dāng)中的元素轉(zhuǎn)換為另外一種元素類型然后再放到流中。
???????? ????mapToInt() 高級用法.....還有mapTOLong()等等斤斧,針對基本數(shù)據(jù)類型進(jìn)行優(yōu)化早抠。
????????????流中的distinct()是依賴Object中的equals方法來判斷是否為相同對象的。所以使用distinct方法需要重寫equals方法;
???????? ????limit()用法(截取*個元素)
????????????skip()用法(跳過第*個元素)
????????????流中的sorted()是需要對象去實(shí)現(xiàn)是Comparable接口,不然會拋出ClassCastException異常撬讽。實(shí)現(xiàn)有兩種方式蕊连,一種是在操作的對象中實(shí)現(xiàn),第二種是通過匿名內(nèi)部類的方式去實(shí)現(xiàn)游昼。
????????????flatMap()可以把一個對象轉(zhuǎn)換為多個對象放到流中甘苍。
????????3、終結(jié)操作
????????????流必須要要有終結(jié)操作,否則無法執(zhí)行烘豌。流被終結(jié)以后無法再次使用载庭。
? ? ? ? ? ? forEach()對流中的元素進(jìn)行遍歷操作。
? ? ? ? ? ? count()返回此流中元素的計(jì)數(shù)廊佩。
? ? ? ? ? ? max() min() 獲取流中的最值囚聚。
???????????collect() 是將流中的元素轉(zhuǎn)為一個集合。
? ? ? ? ? ?anyMatch() 根據(jù)邏輯判斷返回布爾值标锄。
? ? ? ? ? ?allMatch() 可以用來判斷是否都符合邏輯判斷條件顽铸,返回布爾值。
? ? ? ? ? ?noneMatch() 可以用來判斷是否都盧符合邏輯判斷條件料皇,返回布爾值谓松。
? ? ? ? ? ?findAny() 查找流中的任意一元素該方法無法保證獲取的元素一定是流中的第一個元素。
? ? ? ? ? ?ifPresent() 如果Optional對象不為null則繼續(xù)往下執(zhí)行践剂。為null就不繼續(xù)往下執(zhí)行鬼譬。
? ? ? ? ? ?findFirst()獲取流中的第一個元素。
? ? ? ? ? ?reduce()舷手,歸并拧簸,即把sream中的元素組合起來計(jì)算出一個結(jié)果。傳入一個參數(shù),循環(huán)流中元素進(jìn)行操作(可以對傳入的參數(shù)進(jìn)行比較等操作),并返回一個傳入?yún)?shù)類型的數(shù)據(jù)男窟。
? ? ? ? ? reduce兩個參數(shù)的重載形式內(nèi)部的計(jì)算方式如下:
? ? ? ? ? T result = identity;
? ? ? ? ? for(T element : this stream){
????????????result = accumlator.apply(result,element);
? ? ? ? ? }
? ? ? ? ? return result;
四盆赤、Optional
????????養(yǎng)成使用Optional的習(xí)慣可以寫出更加優(yōu)雅的代碼來避免空指針異常贾富。
????????實(shí)際開發(fā)過程中很多數(shù)據(jù)是通過數(shù)據(jù)庫來獲取的,Mybatis從3.5版本以后也支持Optional了牺六〔梗可以直接把dao方法的返回值類型定義為Optional類型,Mybatis會自己把數(shù)據(jù)封裝為Optional對象返回淑际。封裝的過程也不需要我們自己去操作畏纲。
????????很多函數(shù)式編程相關(guān)的API都用了Optional。
????????Optional.ofNullable() 將對象封裝為Optional對象春缕。無論傳入的參數(shù)是否為null都不會出現(xiàn)問題盗胀。(建議使用 )
????????Optional.of() 傳入的參數(shù)必須不能為null。(不建議使用)
????????Optional.empty() 返回一個空的Optional對象锄贼。
????????Optional.ifPresent() 該方法會判斷其內(nèi)部封裝的數(shù)據(jù)是否為空,不為空的時(shí)候才能執(zhí)行具體的消費(fèi)代碼票灰。
????????Optional.isPresent()? 該方法會判斷其內(nèi)部封裝的數(shù)據(jù)是否為空,為空返回false,不為空返回true.
????????Optional.filter()? 在方法中進(jìn)行邏輯判斷,如果滿足會返回Optional對象;不滿足則返回null.
????????Optional.map() 將對象中的值轉(zhuǎn)為Optional<List<T>>對象.
????????如果想要安全的獲取Optional對象中的值宅荤,不推薦使用get()方法屑迂。推薦使用以下幾種方法。
????????Optional.orElseGet() 如果Optional中的值為null,可以自定義返回一個對象冯键。
????????Optional.orElseThrow()? 如果Optional中的值為null,可以手動拋出異常惹盼。
五、函數(shù)式接口
????????**JDK的函數(shù)式接口中都加上了@FunctionalInterface注解進(jìn)行標(biāo)識惫确,無論是否加上該注解只要接口中只有一個抽象方法手报,都是函數(shù)式接口。**
????????**JDK自帶的常用函數(shù)式接口**
????????????Comparator 消費(fèi)接口
????????????Function 計(jì)算轉(zhuǎn)換接口
????????????Predicate 判斷接口
????????????Supplier 生產(chǎn)型接口
????????????**方法引用**
????????????類名或?qū)ο竺?:方法名
????????????寫完Lambda表達(dá)式以后雕薪,發(fā)現(xiàn)方法體只有一行代碼昧诱,并且這行代碼調(diào)用了某個對象的成員方法,方法所有參數(shù)都按照順序傳入所袁,這時(shí)候就可以引用對象的實(shí)例方法盏档,方法調(diào)用時(shí)候使用Idea快捷鍵能夠轉(zhuǎn)換成方法引用即可。
六燥爷、高級玩法
????????map()方法中的第一個泛型不能改(第一個類型就是對象的元素,已經(jīng)是定義好的,不能修改不然會報(bào)錯),但是第二個泛型是可以修改的(可以修改為想要的數(shù)據(jù)類型),簡單理解為就是把流當(dāng)中的元素轉(zhuǎn)換為另外一種元素類型然后再放到流中蜈亩。
????????mapToInt() 高級用法.....還有mapTOLong()等等,針對基本數(shù)據(jù)類型進(jìn)行優(yōu)化前翎。
七稚配、并行流
????????**當(dāng)流中有大量元素,可以使用并行流提高操作效率。其實(shí)并行流就是把任務(wù)分配給多個線程去完成港华。如果使用Stream的話,只需要修改一個方法的調(diào)用就可以使用并行流來提高效率**
????????Stream.parallel()方法
????????parallelStream() 直接獲取并行流