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

原創:花括號MC(微信公衆號:huakuohao-mc)。關注JAVA基礎編程及大數據,注重經驗分享及我的成長。java

雖然如今Oacle官方發佈的最新JDK版本已經到了JDK14。但我相信不少團隊的生產系統上仍是JDK8,甚至有的團隊仍是JDK7或者JDK6。即使不少團隊已經將生產環境升級爲JDK8,可是代碼卻仍是老代碼,也就是說根本沒有使用JDK8提供的新特性。程序員

JDK8 給程序員來帶了不少便利,甚至可讓Java程序員跟PythonRuby等程序員撕逼的時候,也可以揚眉吐氣一把;由於JDK8終於開始支持「行爲參數化了」,也就是你們常常說的,能夠把一個函數看成參數傳給另外一個函數數據庫

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

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

平常編碼的時候用的最多的應該就是集合了。好比從數據庫裏查詢出一天賣出去多少本書,通常咱們會這樣寫,List<Book> books = query.find(date); 而後針對這個集合會作各類各樣的操做來知足產品層面的需求。運維

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

JDK8以前編輯器

//打印出每本書的詳情
for (Book book : books){
    System.out.println(book.toString());
}
複製代碼

使用Stream以後ide

//打印每本書詳情
books.stream().forEach(System.out::print);
複製代碼
場景二:選出價格高於20元的

JDK8以前函數

List<Book> highPriceBooks = new ArrayList<>();
for (Book book : books){
    if (book.getPrice()>20){
        highPriceBooks.add(book);
    }
}
複製代碼

使用Stream以後學習

highPriceBooks = books.stream().filter(book -> book.getPrice()>20).collect(Collectors.toList());
複製代碼
場景三: 按照書價排序

JDK8以前

List<Book> sortBooks = new ArrayList<>();
for (Book book : books){
    Collections.sort(books, new Comparator<Book>() {
        @Override
        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;
            }
        }    
     });
}
複製代碼

使用Stream以後

sortBooks = books.stream().sorted(Comparator.comparing(Book::getPrice)).collect(Collectors.toList());
複製代碼

若是你喜歡能夠直接經過reversed() 反轉,像這樣

sortBooks = books.stream().sorted(Comparator.comparing(Book::getPrice).reversed()).collect(Collectors.toList());
複製代碼
場景四:獲取全部書名

JDK8以前

List<String> bookNames = new ArrayList<>();
for (Book book : books){
    bookNames.add(book.getName());
}
複製代碼

使用Stream以後

bookNames = books.stream().map(Book::getName).collect(Collectors.toList());
複製代碼
場景五:得到全部書價格總和

JDK8以前

//計算一天當中賣出的全部書的價格總和。
int totalNum = 0;
for (Book book : books){
    totalNum += book.getPrice();
}
複製代碼

使用Stream以後

totalNum = books.stream().map(Book::getPrice).reduce(0,(a,b)->a+b);
複製代碼
還有更多

你覺得JDK8Stream就這麼點本事嗎?它還能夠完成鏈式處理,像這樣

//選出價格高於20的兩個元素。
books.stream().filter(book -> book.getPrice()> 20).limit(2).collect(Collectors.toList());
複製代碼

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

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


推薦閱讀:

Java程序員必讀核心書單—基礎版

Javaer運維指令合集(快餐版)

手把手教你搭建一套ELK日誌搜索運維平臺

·END·
 

花括號MC

Java·大數據·我的成長

微信號:huakuohao-mc
相關文章
相關標籤/搜索