1. Lambda表達(dá)式和函數(shù)式接口
Java 8中,F(xiàn)unction,Consumer,Predicate,Supplier:
Function<T, R>: R apply(T t); 接受一個(gè)入?yún),輸出一個(gè)返回值R鹉胖;
Supplier<T> : T get(); 無(wú)入?yún)⑿燮海敵鲆粋€(gè)類(lèi)型為T(mén)的返回值剃袍;
Consumer<T>:void accept(T t); 輸入一個(gè)入?yún),無(wú)返回小泉;
Predicate<T>: boolean test(T t); 輸入一個(gè)入?yún)肢预,返回一個(gè)boolean值 ;
2. 接口的默認(rèn)方法和靜態(tài)方法
默認(rèn)方法使用default關(guān)鍵字
3. 方法引用
- 構(gòu)造方法引用(Class::new)
- 靜態(tài)方法引用(Class:static_method)洼哎,只支持一個(gè)參數(shù)
- 類(lèi)實(shí)例方法引用(Class::method)烫映,方法沒(méi)有參數(shù)
- 引用特殊類(lèi)(instance::method),只支持一個(gè)參數(shù)
4. 重復(fù)注釋
5. 更好的類(lèi)型推斷
6. 注解的擴(kuò)展
7. Stream
1)Intermediate:
map (mapToInt, flatMap 等)噩峦、 filter锭沟、 distinct、 sorted壕探、 peek冈钦、 limit郊丛、 skip李请、 parallel、 sequential厉熟、 unordered
2)Terminal:
forEach导盅、 forEachOrdered、 toArray揍瑟、 reduce白翻、 collect、 min绢片、 max滤馍、 count、 anyMatch底循、 allMatch巢株、 noneMatch、 findFirst熙涤、 findAny阁苞、 iterator
3)Short-circuiting:
anyMatch困檩、 allMatch、 noneMatch那槽、 findFirst悼沿、 findAny、 limit
- map/flatMap:把 input Stream 的每一個(gè)元素骚灸,映射成 output Stream 的另外一個(gè)元素糟趾。map是一對(duì)一映射,flatMap是一對(duì)多映射甚牲;
- filter: 對(duì)原始 Stream 進(jìn)行某項(xiàng)測(cè)試拉讯,通過(guò)測(cè)試的元素被留下來(lái)生成一個(gè)新 Stream
- forEach : 在 Stream 的每一個(gè)元素上執(zhí)行該表達(dá)式
- peek : 每個(gè)元素執(zhí)行操作并返回一個(gè)新的 Stream
- findFirst:返回 Stream 的第一個(gè)元素,或者空鳖藕,重點(diǎn)的是它的返回值類(lèi)型:Optional魔慷,作為一個(gè)容器,它可能含有某值著恩,或者不包含院尔。使用它的目的是盡可能避免 NullPointerException
- reduce : 把 Stream 元素組合起來(lái),供一個(gè)起始值(種子)喉誊,然后依照運(yùn)算規(guī)則(BinaryOperator)邀摆,和前面 Stream 的第一個(gè)、第二個(gè)伍茄、第 n 個(gè)元素組合栋盹。
- limit/skip : limit 返回 Stream 的前面 n 個(gè)元素;skip 則是扔掉前 n 個(gè)元素
- sorted : 排序
- min/max/distinct : min 和 max 的功能也可以通過(guò)對(duì) Stream 元素先排序敷矫,再 findFirst 來(lái)實(shí)現(xiàn)例获,但前者的性能會(huì)更好,為 O(n)曹仗,而 sorted 的成本是 O(n log n)榨汤。
- distinct 去重
- Match : 匹配,allMatch怎茫、anyMatch收壕、noneMatch
- Stream.generate:控制流的生成
- Stream.iterate:iterate 跟 reduce 操作很像,接受一個(gè)種子值轨蛤,和一個(gè)
UnaryOperator(例如 f)蜜宪。然后種子值成為 Stream 的第一個(gè)元素,f(seed) 為第二個(gè)祥山,f(f(seed)) 第三個(gè)圃验。與 Stream.generate 相仿,在 iterate 時(shí)候管道必須有 limit 這樣的操作來(lái)限制 Stream 大小枪蘑。 - Collectors :輔助進(jìn)行各類(lèi)有用的 reduction 操作损谦,例如轉(zhuǎn)變輸出為 Collection岖免,把 Stream 元素進(jìn)行歸組。
- groupingBy/partitioningBy:
8、Stream 的特性可以歸納為:
-
不是數(shù)據(jù)結(jié)構(gòu)
它沒(méi)有內(nèi)部存儲(chǔ),它只是用操作管道從 source(數(shù)據(jù)結(jié)構(gòu)蕊苗、數(shù)組、generator function闯参、IO channel)抓取數(shù)據(jù)。
它也絕不修改自己所封裝的底層數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)悲立。例如 Stream 的 filter 操作會(huì)產(chǎn)生一個(gè)不包含被過(guò)濾元素的新 Stream鹿寨,而不是從 source 刪除那些元素。
所有 Stream 的操作必須以 lambda 表達(dá)式為參數(shù) -
不支持索引訪(fǎng)問(wèn)
你可以請(qǐng)求第一個(gè)元素薪夕,但無(wú)法請(qǐng)求第二個(gè)脚草,第三個(gè),或最后一個(gè)原献。不過(guò)請(qǐng)參閱下一項(xiàng)馏慨。
很容易生成數(shù)組或者 List -
惰性化
很多 Stream 操作是向后延遲的,一直到它弄清楚了最后需要多少數(shù)據(jù)才會(huì)開(kāi)始姑隅。
Intermediate 操作永遠(yuǎn)是惰性化的写隶。 -
并行能力
當(dāng)一個(gè) Stream 是并行化的,就不需要再寫(xiě)多線(xiàn)程代碼讲仰,所有對(duì)它的操作會(huì)自動(dòng)并行進(jìn)行的慕趴。 -
可以是無(wú)限的
集合有固定大小,Stream 則不必鄙陡。limit(n) 和 findFirst() 這類(lèi)的 short-circuiting 操作可以對(duì)無(wú)限的 Stream 進(jìn)行運(yùn)算并很快完成冕房。