<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手把手帶你體驗(yàn)Stream流

          共 3096字,需瀏覽 7分鐘

           ·

          2019-09-24 23:21

          前言

          只有光頭才能變強(qiáng)。

          文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y

          上一篇講解到了Lambda表達(dá)式的使用《最近學(xué)到的Lambda表達(dá)式基礎(chǔ)知識(shí)》,還沒看的同學(xué)可以先去閱讀一下哈~

          相信也有不少的同學(xué)想要知道:Lambda表達(dá)式在工作中哪個(gè)場(chǎng)景會(huì)用得比較多?跟Lambda搭邊的,使用Stream流會(huì)比較多

          一般人第一次看Stream流的代碼,都會(huì)有點(diǎn)看不懂(它的代碼看起來(lái)好像就不是寫Java一樣.),希望這篇文章能帶大家入個(gè)門

          一、體驗(yàn)Stream流

          大家在自學(xué)時(shí),大多數(shù)會(huì)學(xué)過(guò)一個(gè)程序:算出從數(shù)組元素的和,當(dāng)時(shí)我們是怎么寫的?一般來(lái)說(shuō)是這樣的:

          public?static?void?main(String[]?args)?{
          ????int[]?nums?=?{?1,?2,?3?};
          ????int?sum?=?0;
          ????for?(int?i?:?nums)?{
          ????????sum?+=?i;
          ????}
          ????System.out.println("結(jié)果為:"?+?sum);
          }

          如果我們使用Stream流的話,可以這樣:

          public?static?void?main(String[]?args)?{
          ????int[]?nums?=?{?1,?2,?3?};
          ????int?sum2?=?IntStream.of(nums).sum();
          ????System.out.println("結(jié)果為:"?+?sum2);
          }

          代碼量上可以明顯看出,用Stream流的方式會(huì)少一些。

          我理解的Stream流編程就是:某些場(chǎng)景會(huì)經(jīng)常用到操作(求和/去重/過(guò)濾….等等),已經(jīng)封裝好API給你了,你自己別寫了,調(diào)我給你提供的API就好了

          1.1 支持并發(fā)

          回到我們最原始的代碼:

          public?static?void?main(String[]?args)?{
          ????int[]?nums?=?{?1,?2,?3?};
          ????int?sum?=?0;
          ????for?(int?i?:?nums)?{
          ????????sum?+=?i;
          ????}
          ????System.out.println("結(jié)果為:"?+?sum);
          }

          如果我們想要for循環(huán)的內(nèi)部支持并發(fā)的話,顯然不太好去寫。但使用Stream流的方式,調(diào)用一個(gè)方法就可以支持并發(fā)(parallel):

          public?static?void?main(String[]?args)?{
          ????int[]?nums?=?{?1,?2,?3?};
          ????int?sum2?=?IntStream.of(nums).parallel().sum();
          ????System.out.println("結(jié)果為:"?+?sum2);
          }

          優(yōu)點(diǎn):調(diào)API肯定是比自己寫的代碼量要少。

          缺點(diǎn):不方便調(diào)試

          為什么要使用Stream流在我看來(lái)就是以上兩個(gè)原因:

          • 方便并發(fā)

          • 代碼量少(直接調(diào)用API)

          二、如何使用Stream流?

          5c39603943081c5228e51ff0788c3f08.webpStream繼承結(jié)構(gòu)圖

          使用Stream流分為三步:

          1. 創(chuàng)建Stream流

          2. 通過(guò)Stream流對(duì)象執(zhí)行中間操作

          3. 執(zhí)行最終操作,得到結(jié)果

          ee6031a753629c37b80ea9ae66387b87.webp三步走

          2.1 創(chuàng)建流

          創(chuàng)建流我們最常用的就是從集合中創(chuàng)建出流

          /**
          ?*?返回的都是流對(duì)象
          ?*?@param?args
          ?*/

          public?static?void?main(String[]?args)?{
          ????List?list?=?new?ArrayList<>();
          ????//?從集合創(chuàng)建
          ????Stream?stream?=?list.stream();
          ????Stream?stream1?=?list.parallelStream();

          ????//?從數(shù)組創(chuàng)建
          ????IntStream?stream2?=?Arrays.stream(new?int[]{2,?3,?5});

          ????//?創(chuàng)建數(shù)字流
          ????IntStream?intStream?=?IntStream.of(1,?2,?3);

          ????//?使用random創(chuàng)建
          ????IntStream?limit?=?new?Random().ints().limit(10);

          }

          2.2 執(zhí)行中間操作

          怎么理解中間操作?意思是這樣的:在上面我們已經(jīng)能創(chuàng)建出Stream了,我們是對(duì)Stream進(jìn)行操作,對(duì)Stream操作返回完返回的還是Stream,那么我們稱這個(gè)操作為中間操作。

          7b57eca8f43c6c7d47e56234b5deec75.webp中間操作 解釋

          比如,我們現(xiàn)在有個(gè)字符串my name is 007,代碼如下:

          String?str?=?"my?name?is?007";

          Stream.of(str.split("?")).filter(s?->?s.length()?>?2)
          ????.map(s?->?s.length()).forEach(System.out::println);

          分解:

          1、從字符串?dāng)?shù)組創(chuàng)建出流對(duì)象:

          Stream?split?=?Stream.of(str.split("?"));

          2、通過(guò)流對(duì)象的API執(zhí)行中間操作(filter),返回的還是流對(duì)象:

          Stream?filterStream?=?split.filter(s?->?s.length()?>?2);

          3、通過(guò)返回的流對(duì)象再執(zhí)行中間操作(map),返回的還是流對(duì)象:

          Stream?integerStream?=?filterStream.map(s?->?s.length());

          因?yàn)橹虚g操作返回的都是流對(duì)象,所以我們可以鏈?zhǔn)秸{(diào)用

          注意:Stream上的操作并不會(huì)立即執(zhí)行,只有等到用戶真正需要結(jié)果的時(shí)候才會(huì)執(zhí)行(惰性求值)。

          比如說(shuō),peek()是一個(gè)中間操作,返回的是Stream流對(duì)象,只要它不執(zhí)行最終的操作,這個(gè)Stream是不會(huì)執(zhí)行的。

          String?str?=?"my?name?is?007";
          Stream.of(str.split("?")).peek(System.out::println);?//?不會(huì)有信息打印

          2.3 執(zhí)行最終操作

          最終操作返回的不再是Stream對(duì)象,調(diào)用了最終操作的方法,Stream才會(huì)執(zhí)行。還是以上面的例子為例:

          String?str?=?"my?name?is?007";
          Stream.of(str.split("?")).peek(System.out::println).forEach(System.out::println)

          這次我們加入了最終操作,所以這次的Stream流會(huì)被執(zhí)行,由于中間操作和最終操作都是執(zhí)行打印,所以會(huì)看到兩次打印:

          bcc60039891194d439f4e924ed6e9e77.webp結(jié)果圖

          至于中間操作和最終操作怎么區(qū)分,我們以返回值來(lái)看就行了。中間操作返回的是Stream實(shí)例對(duì)象,最終操作返回的不是Stream實(shí)例對(duì)象:

          40cf920e03dd24e86eb219721e81314a.webpStream接口的方法

          最后

          這篇文章主要跟大家一起初步認(rèn)識(shí)一下Stream流,至于中間操作、最終操作的API講解我就不寫了(網(wǎng)上的教程也很多)

          使用Stream的原因我認(rèn)為有兩個(gè):

          1. JDK庫(kù)提供現(xiàn)有的API,代碼寫起來(lái)簡(jiǎn)潔優(yōu)化

          2. 方便并發(fā)。大家可以記住一個(gè)結(jié)論:在多核情況下,可以使用并行Stream API來(lái)發(fā)揮多核優(yōu)勢(shì)。在單核的情況下,我們自己寫的for性能不比Stream API 差多少

          參考資料:

          公眾號(hào)文章導(dǎo)航兩年嘔心瀝血的文章!


          200多篇原創(chuàng)技術(shù)文章海量視頻資源精美腦圖面試題

          長(zhǎng)按掃碼可關(guān)注獲取?

          在看和分享對(duì)我非常重要!83c8eebdcc8a6ba190c0191ed0d4adf1.webp

          瀏覽 54
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  高清无码一区 | 爱情岛成人网 | 综合亚洲自拍 | 黄色片在线免费观看视频 | 考逼视频网站 |