Java8之Stream流(一)基礎體驗

Java8之Stream流(二)關鍵知識點
Java8之Stream流(三)縮減操作
Java8之Stream流(四)并行流
Java8之Stream流(五)映射流
Java8之Stream流(六)收集
Java8之Stream流(七)流與迭代器

Java8新增的功能中,要數lambda表達式和流API最為重要了這篇文章主要介紹流API的基礎,也是流API系列的第一篇文章,整個系列看完,lambda表達式和函數式接口的分析運用能力你應該也一起掌握了,建議大家一起服用。話不多說,直奔主題

什么是流API? 它能做一些什么?

我們應該知道(絕對知道~)API是一個程序向使用者提供的一些方法,通過這些方法就能實現某些功能。所以對于流API來說,重點是怎么理解"流"這個概念,所謂的流:就是數據的渠道,所以,流代表的是一個對象的序列它和Java I/O類里使用的"流"不同。雖然在概念上與java.util.stream中定義的流是類似的,但它們是不同的,流API中的流是描述某個流類型的對象。

流API中的流操作的數據源,是數組或者是集合。它本身是不存儲數據的,只是移動數據,在移動過程中可能會對數據進行過濾,排序或者其它操作,但是,一般情況下(絕大數情況下),流操作本身不會修改數據源,比如,對流排序不會修改數據源的順序。相反,它會創建一個新的流,其中包含排序后的結果。

從一個簡單的例子,體驗流API的強大與優雅

這個簡單的Demo,主要是對一個由1-6亂序組成的List對應的流進行操作,然后通過這個流,就可以獲取到列表里面最大最小值、排序、過濾某些元素等等的操作。并且這此操作不會改變原List里面的數據。Demo里面需要注意的地方就是流API里面的"終端操作"和"中間操作"的區別:其實也很簡單,終端操作會消費流,一個被消費過的流是不能被再次利用的,但我們在實際應用的時候,并不會受到太大的影響(Ps:如果你們能動手實踐一下我相信你體驗更好,強烈推薦!)

public class Main {


    public static void main(String[] args) { 
        learnStream();
    }

    private static void learnStream() {
        //首先,創建一個1-6亂序的List
        List<Integer> lists = new ArrayList<>();
        lists.add(4);
        lists.add(3);
        lists.add(6);
        lists.add(1);
        lists.add(5);
        lists.add(2);

        //看看List里面的數據是什么樣子的先
        System.out.print("List里面的數據:");
        for (Integer elem : lists) System.out.print(elem + " ");// 4 3 6 1 5 2

        System.out.println();

        //最小值
        System.out.print("List中最小的值為:");
        Stream<Integer> stream = lists.stream();
        Optional<Integer> min = stream.min(Integer::compareTo);
        if (min.isPresent()) {
            System.out.println(min.get());//1
        }


        //最大值
        System.out.print("List中最大的值為:");
        lists.stream().max(Integer::compareTo).ifPresent(System.out::println);//6

        //排序
        System.out.print("將List流進行排序:");
        Stream<Integer> sorted = lists.stream().sorted();
        sorted.forEach(elem -> System.out.print(elem + " "));// 1 2 3 4 5 6

        System.out.println();

        //過濾
        System.out.print("過濾List流,只剩下那些大于3的元素:");
        lists.stream()
                .filter(elem -> elem > 3)
                .forEach(elem -> System.out.print(elem + " "));// 4 5 6

        System.out.println();

        //過濾
        System.out.println("過濾List流,只剩下那些大于0并且小于4的元素:\n=====begin=====");
        lists.stream()
                .filter(elem -> elem > 0)
                .filter(elem -> elem < 4)
                .sorted(Integer::compareTo)
                .forEach(System.out::println);// 1 2 3

        System.out.println("=====end=====");
        //經過了前面的這么多流操作,我們再來看看List里面的值有沒有發生什么改變
        System.out.print("原List里面的數據:");
        for (Integer elem : lists) System.out.print(elem + " ");// 4 3 6 1 5 2
    }
}

如果剛才的Demo你認真讀了,我相信你心里面多多少少都會產生一點點漣漪,沒錯,流API結合lambda表達式,就是這么優美!下面我詳細介紹一下整個Demo,讓大家更加清淅:

最小值

 //最小值
System.out.print("List中最小的值為:");
Stream<Integer> stream = lists.stream();
Optional<Integer> min = stream.min(Integer::compareTo);
if (min.isPresent()) {
     System.out.println(min.get());//1
}

首先通過stream()方法獲取List對應的流,如果你對Java8的集合框架有一定的了解,你應該知道stream()是由Collection接口提供的。然后就可以通過min()獲取流中的最小值了,當然這個流中的最小值肯定也是List里面的最小值。min()方法接收一個Comparator類型的參數,這個比較器是用于比較流中的兩個元素的。我們這里把Integer的compareTo()的引用傳遞給了min()。它返回的類型是Optional,Optional可謂是NullPointException的大殺器啊,感興趣的同學,了解一下。然后判斷最小值存不存在,如果存在,就通過Optional的get()讀取出來。很簡單有木有!

最大值

//最大值
System.out.print("List中最大的值為:");
lists.stream().max(Integer::compareTo).ifPresent(System.out::println);//6

語法糖爽YY有木有,不過需要注意的一點,因為min()是一個終端操作,所以這個流是不可以再用了,因此我們需要通過stream()重新生成一個流,(但這其實并不影響我們的實際生產的:①方法功能單一原則②還有其它很多很強大的方法組合能讓你實現各種功能啊.)ifPresent其實和上面的最小值的if判斷是一定要,如果存在最大值,我們就打印一下,這里只不過用了一些函數式寫法而已。

排序和遍歷

 //排序
System.out.print("將List流進行排序:");
Stream<Integer> sorted = lists.stream().sorted();
sorted.forEach(elem -> System.out.print(elem + " "));// 1 2 3 4 5 6

通過上面的講解,相信這個已經難不了你了,sorted()方法是用于排序的,它的一個重載方法可以接收一個Comparator類型的參數,讓你自定義你的排序規則。forEach方法就遍歷。

過濾

//過濾
System.out.println("過濾List流,只剩下那些大于0并且小于4的元素:\n=====begin=====");
lists.stream()
          .filter(elem -> elem > 0)
          .filter(elem -> elem < 4)
          .sorted(Integer::compareTo)
          .forEach(System.out::println);// 1 2 3

System.out.println("=====end=====");

filter()是基于一個謂詞過濾流,它返回一個只包含滿足謂詞的元素的新流。它的參數形式是Predicate<? super T>是在java.util.function包下的泛型函數式接口。并且filter是一個中間操作,而且還可以同時存在多個filter。這里的兩個過濾器,我們都傳遞了lambda表達式。

小結一下

其實基本的流API使用就是這么簡單,結合lambda表達式后,一切都變得特別清淅,這個簡單的Demo展示了一些基礎的功能,它或許就擴展了你操作數組或者集合框架的思路,讓你操作集合和數組,變得更加的容易,簡單和高效。當然流API的的功能肯定不止這一點點,我會陸陸續續完善整個系列,大家跟著我的步伐,就這一次,踏踏實實學好流式API,走向人生巔峰,迎娶白富美!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,809評論 18 139
  • 大抵 被定義為天才的少年 在世間留下了絕美作品 便結束了這一世的行程 后人說 是天妒英才 天若妒他 何以佑之 是他...
    幸福的李慧閱讀 153評論 0 0
  • 在一個華麗的聚會上 我們重逢 你害羞,當我擁抱你 我感謝你 在我去那個城市,而你離開時 在經濟上對我的資助 我甚至...
    長耳當聽閱讀 213評論 0 2
  • 第一次接觸冥想是在大概四月份的時候,貓友公子,她在我們的打卡里面問大家有沒有興趣加入冥想群,她說她一個免費的名額,...
    會飛的蓉子閱讀 460評論 0 1
  • 蘇洢閱讀 527評論 0 0