Java8之Stream流(一)基礎(chǔ)體驗(yàn)

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

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

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

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

流API中的流操作的數(shù)據(jù)源,是數(shù)組或者是集合。它本身是不存儲(chǔ)數(shù)據(jù)的,只是移動(dòng)數(shù)據(jù),在移動(dòng)過程中可能會(huì)對(duì)數(shù)據(jù)進(jìn)行過濾,排序或者其它操作,但是,一般情況下(絕大數(shù)情況下),流操作本身不會(huì)修改數(shù)據(jù)源,比如,對(duì)流排序不會(huì)修改數(shù)據(jù)源的順序。相反,它會(huì)創(chuàng)建一個(gè)新的流,其中包含排序后的結(jié)果。

從一個(gè)簡(jiǎn)單的例子,體驗(yàn)流API的強(qiáng)大與優(yōu)雅

這個(gè)簡(jiǎn)單的Demo,主要是對(duì)一個(gè)由1-6亂序組成的List對(duì)應(yīng)的流進(jìn)行操作,然后通過這個(gè)流,就可以獲取到列表里面最大最小值、排序、過濾某些元素等等的操作。并且這此操作不會(huì)改變?cè)璍ist里面的數(shù)據(jù)。Demo里面需要注意的地方就是流API里面的"終端操作"和"中間操作"的區(qū)別:其實(shí)也很簡(jiǎn)單,終端操作會(huì)消費(fèi)流,一個(gè)被消費(fèi)過的流是不能被再次利用的,但我們?cè)趯?shí)際應(yīng)用的時(shí)候,并不會(huì)受到太大的影響(Ps:如果你們能動(dòng)手實(shí)踐一下我相信你體驗(yàn)更好,強(qiáng)烈推薦!)

public class Main {


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

    private static void learnStream() {
        //首先,創(chuàng)建一個(gè)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里面的數(shù)據(jù)是什么樣子的先
        System.out.print("List里面的數(shù)據(jù):");
        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流進(jìn)行排序:");
        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=====");
        //經(jīng)過了前面的這么多流操作,我們?cè)賮砜纯碙ist里面的值有沒有發(fā)生什么改變
        System.out.print("原List里面的數(shù)據(jù):");
        for (Integer elem : lists) System.out.print(elem + " ");// 4 3 6 1 5 2
    }
}

如果剛才的Demo你認(rèn)真讀了,我相信你心里面多多少少都會(huì)產(chǎn)生一點(diǎn)點(diǎn)漣漪,沒錯(cuò),流API結(jié)合lambda表達(dá)式,就是這么優(yōu)美!下面我詳細(xì)介紹一下整個(gè)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對(duì)應(yīng)的流,如果你對(duì)Java8的集合框架有一定的了解,你應(yīng)該知道stream()是由Collection接口提供的。然后就可以通過min()獲取流中的最小值了,當(dāng)然這個(gè)流中的最小值肯定也是List里面的最小值。min()方法接收一個(gè)Comparator類型的參數(shù),這個(gè)比較器是用于比較流中的兩個(gè)元素的。我們這里把Integer的compareTo()的引用傳遞給了min()。它返回的類型是Optional,Optional可謂是NullPointException的大殺器啊,感興趣的同學(xué),了解一下。然后判斷最小值存不存在,如果存在,就通過Optional的get()讀取出來。很簡(jiǎn)單有木有!

最大值

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

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

排序和遍歷

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

通過上面的講解,相信這個(gè)已經(jīng)難不了你了,sorted()方法是用于排序的,它的一個(gè)重載方法可以接收一個(gè)Comparator類型的參數(shù),讓你自定義你的排序規(guī)則。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()是基于一個(gè)謂詞過濾流,它返回一個(gè)只包含滿足謂詞的元素的新流。它的參數(shù)形式是Predicate<? super T>是在java.util.function包下的泛型函數(shù)式接口。并且filter是一個(gè)中間操作,而且還可以同時(shí)存在多個(gè)filter。這里的兩個(gè)過濾器,我們都傳遞了lambda表達(dá)式。

小結(jié)一下

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139
  • 大抵 被定義為天才的少年 在世間留下了絕美作品 便結(jié)束了這一世的行程 后人說 是天妒英才 天若妒他 何以佑之 是他...
    幸福的李慧閱讀 171評(píng)論 0 0
  • 在一個(gè)華麗的聚會(huì)上 我們重逢 你害羞,當(dāng)我擁抱你 我感謝你 在我去那個(gè)城市,而你離開時(shí) 在經(jīng)濟(jì)上對(duì)我的資助 我甚至...
    長(zhǎng)耳當(dāng)聽閱讀 230評(píng)論 0 2
  • 第一次接觸冥想是在大概四月份的時(shí)候,貓友公子,她在我們的打卡里面問大家有沒有興趣加入冥想群,她說她一個(gè)免費(fèi)的名額,...
    會(huì)飛的蓉子閱讀 520評(píng)論 0 1
  • 蘇洢閱讀 621評(píng)論 0 0

友情鏈接更多精彩內(nèi)容