真香預警!Java8的Stream流,沒體驗過的永遠不會知道

真香預警!Java8的Stream流,沒體驗過的永遠不會知道

雖然現在Oacle官方發佈的最新JDK版本已經到了JDK14。但我相信很多團隊的生產系統上還是JDK8,甚至有的團隊還是JDK7或者JDK6。即便很多團隊已經將生產環境升級為JDK8,但是代碼卻還是老代碼,也就是說根本沒有使用JDK8提供的新特性。

JDK8 給程序員來帶了很多便利,甚至可以讓Java程序員跟Python,Ruby等程序員撕逼的時候,也能夠揚眉吐氣一把;因為JDK8終於開始支持“行為參數化了”,也就是大家經常說的,可以把一個函數當作參數傳給另一個函數。

JDK8最明顯的兩個變化就是開始支持Lambda表達式,以及集合的Stream流式處理。這兩個特性都可以讓我們寫的代碼更優雅,也能讓我們在實現某些功能的時候更輕鬆,特別是Stream,那簡直是超級好用,性價比超級高,花上20分鐘去學習一下,就能讓你的代碼質量提升一個檔次。

下面我列舉幾個簡單的小場景,讓各位感受一下Java8提供的StreamAPI是多麼的方便優雅,也算是拋磚引玉了。

日常編碼的時候用的最多的應該就是集合了。比如從數據庫裡查詢出一天賣出去多少本書,一般我們會這樣寫,List books = query.find(date); 然後針對這個集合會做各種各樣的操作來滿足產品層面的需求。

場景一:打印出每本書的詳情。

JDK8之前

<code> 

for

(Book

book

: books){

System

.out

.println

(book.toString()); }/<code>

使用Stream之後

<code> 

books

.stream

()

.forEach

(book -> book.toString());/<code>
場景二:選出價格高於20元的

JDK8之前

<code>List highPriceBooks = 

new

ArrayList<>();

for

(Book book : books){

if

(book.getPrice()>

20

){ highPriceBooks.

add

(book); } }/<code>

使用Stream之後

<code>

highPriceBooks

= books.stream().filter(book -> book.getPrice()>

20

).collect(Collectors.toList())/<code>
場景三: 按照書價排序

JDK8之前

<code>List sortBooks = 

new

ArrayList<>();

for

(Book book : books){ Collections.sort(books,

new

Comparator() {

public

int

compare

(Book o1, Book o2)

{

if

(o1.getPrice() > o2.getPrice()){

return

1

; }

else

if

(o1.getPrice() < o2.getPrice()){

return

-

1

; }

else

{

return

0

; } }    }); }/<code>

使用Stream之後

<code>

sortBooks

= books.stream().sorted(Comparator.comparing(Book::getPrice)).collect(Collectors.toList())/<code>

如果你喜歡可以直接通過reversed() 反轉,像這樣

<code>

sortBooks

= books.stream().sorted(Comparator.comparing(Book::getPrice).reversed()).collect(Collectors.toList())/<code>
場景四:獲取所有書名

JDK8之前

<code>List bookNames = 

new

ArrayList<>();

for

(Book book : books){ bookNames.

add

(book.getName()); }/<code>

使用Stream之後

<code>

bookNames

= books.stream().map(Book::getName).collect(Collectors.toList())/<code>
場景五:獲得所有書價格總和

JDK8之前

<code>

//計算一天當中賣出的所有書的價格總和。

int

totalNum = 0;

for

(Book book : books){

totalNum

+= book.getPrice();

}

/<code>

使用Stream之後

<code>totalNum = books.stream().map(Book::getPrice).reduce(

0

,

(a,b)

->

a+b);/<code>
還有更多

你以為JDK8的Stream就這麼點本事嗎?它還可以完成鏈式處理,像這樣

<code> 

books

.stream

()

.filter

(book -> book.getPrice()>

20

)

.limit

(

2

)

.collect

(Collectors.toList());/<code>

此外如果你想利用你多核的CPU並行處理集合以提高計算速度,在JDK8中只需要簡單的調用一下parallelStream 方法。就像這樣books.parallelStream().forEach(book -> book.toString()); JDK自動幫你並行處理,厲不厲害。

好了,就寫這麼多了,更多的使用技巧還得你自己去挖掘體會,我要去擼代碼了,拜拜! 記住一句話,Java8提供的那些新東西,值得你花更多的精力去學習研究。

作者:花括號MC

鏈接:https://juejin.im/post/5e9672af6fb9a03c5f73fd28

來源:掘金


分享到:


相關文章: