Java8 Stream流使用
破解IDEA請查看:IDEA激活碼2022.1最新激活注冊碼–破解教程「永久激活,親測有效」
正文
JDK的發(fā)行版本都已經(jīng)衍生至19了,這個從8就引入的Stream流應(yīng)當是屬于Java程序員基操了。然而最近面試遇到開發(fā)經(jīng)驗3年的工程師,對它似乎不是很熟悉,讓我大吃一驚。本文通過常用的一些簡單的例子把它以最小的時間成本給大家說明白。
一、楔子
在使用集合的時候迭代往往是使用的最多的,對比是否使用stream的代碼實現(xiàn)
第一次看到這樣的寫法時,可能會認為這樣的代碼可讀性不高,但當你熟悉之后,你會改變對它的看法。
二、如何創(chuàng)建流
想要使用Stream,首先需要創(chuàng)建一個流,最常見的是直接調(diào)用集合的java.util.Collection#stream
方法
當然通過數(shù)組同樣能夠創(chuàng)建
三、流操作的分類
Stream流操作共分為兩個大類:惰性求值、及早求值
Stream操作時,先調(diào)用了filter方法傳入了一個Lambda表達式代表過濾規(guī)則,后調(diào)用了collect方法表示將流轉(zhuǎn)換為List集合。
我們不需要去記哪些方法是惰性求值,如果方法的返回值是Stream那么它代表的就是惰性求值。如果返回另外一個值或空,那么它代表的就是及早求值。
這些流操作定義之后,在程序中是怎么調(diào)用的定義的lambda表達式的?
例如在java.util.stream.ReferencePipeline抽象類中有對Stream接口collect的實現(xiàn),方法由final修飾,不再支持重寫。
四、常用基操
map
映射,x->y,轉(zhuǎn)換數(shù)據(jù)類型
filter
過濾,“排除不符合某個條件的元素”,也就是返回true的時候保留,返回false排除
sorted
排序,
如果要降序(大-->?。?,僅需再調(diào)用reversed方法Comparator.comparing(Student::getScore).reversed())
這就是聲明式編程,你只管叫它做什么,而不像命令式編程叫它如何做。
reduce
對于reduce操作,不建議在現(xiàn)實中使用。
如果你有累加、求最大值、最小值的需求,Stream封裝了更簡單的方法。
min || max
顧名思義,求取集合中的最小值和最大值。
Java8對Comparator
接口提供了新的靜態(tài)方法comparing
,這個方法返回Comparator
對象,以前我們需要手動實現(xiàn)compare
比較,現(xiàn)在我們只需要調(diào)用Comparator.comparing
靜態(tài)方法即可。
summaryStatistics
求和操作也是常用的操作,利用reduce會讓代碼晦澀難懂,特別是復(fù)雜的對象類型。
Collectors
前面的大部分操作都是以collect(Collectors.toList())
結(jié)尾,看多了自然也大概猜得到它是將流轉(zhuǎn)換為集合對象。最大的功勞當屬Java8新提供的類——Collectors
收集器。
示例給出比較常見的List和Map的轉(zhuǎn)換,