java8-stream 1 初見

學(xué)習(xí)java如同學(xué)習(xí)武功,代碼規(guī)范就是武功招式,設(shè)計(jì)模式如同內(nèi)功心法。如果你會(huì)幾個(gè)好用的開源工具,就如同學(xué)了幾本武學(xué)秘籍。秘籍雖然好,但是如果沒有用對(duì),分分鐘反傷自己。

化骨綿掌外柔內(nèi)剛,以爆發(fā)勁為主。手法以掌為主,運(yùn)轉(zhuǎn)舒展,動(dòng)作連綿不斷,掌法運(yùn)行成環(huán);勁力內(nèi)蓄剛勁,外現(xiàn)綿柔,爆發(fā)迅猛。
stream就是java中的化骨綿掌。一套連續(xù)不斷地輸出,幫我們攻擊拉滿。

讓我們通過一個(gè)具體的小任務(wù)來看看,stream和普通招式對(duì)比。
我現(xiàn)在需要將integerList中的所有數(shù)字都取平方,并且輸出到resultList

普通招式1 ??????

public class Test20181129 {

    List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);

    @Test
    public void test1() {

        //用于存放結(jié)果
        List<Integer> resultList = new LinkedList<>();

        //循環(huán)調(diào)用函數(shù)
        for (int i = 0; i < integerList.size(); i++) {
            resultList.add(fun(integerList.get(i)));
        }

        //輸出結(jié)果
        System.out.println(resultList);

    }

    private Integer fun(Integer i) {
        return i * i;
    }


}
[1, 4, 9, 16, 25]

普通招式2 ??????

public class Test20181129 {

    List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);

    @Test
    public void test2() {

        //用于存放結(jié)果
        List<Integer> resultList = new LinkedList<>();

        //循環(huán)調(diào)用函數(shù)
        for (Integer integer :integerList) {
            resultList.add(fun(integer));
        }

        //輸出結(jié)果
        System.out.println(resultList);

    }

    private Integer fun(Integer i) {
        return i * i;
    }

}
[1, 4, 9, 16, 25]

stream ??????????

public class Test20181129 {

    List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);

    @Test
    public void test3() {

        List<Integer> result = integerList.parallelStream().
                map(integer -> integer * integer).
                collect(Collectors.toList());
        System.out.println(result);

    }

}
[1, 4, 9, 16, 25]

好像沒有很厲害嘛,僅僅只是省了幾行代碼而已。

那我們現(xiàn)在讓fun函數(shù)需要消耗點(diǎn)時(shí)間,然后看看不同的方法都要用多少時(shí)間?

普通招式1 節(jié)省時(shí)間 ??

public class Test20181129 {

    List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);

    @Test
    public void test1() {

        long begin = System.currentTimeMillis();

        //用于存放結(jié)果
        List<Integer> resultList = new LinkedList<>();

        //循環(huán)調(diào)用函數(shù)
        for (int i = 0; i < integerList.size(); i++) {
            resultList.add(fun(integerList.get(i)));
        }

        long end = System.currentTimeMillis();

        System.out.println("useTime: "+(end-begin));
        //輸出結(jié)果
        System.out.println(resultList);

    }

    private Integer fun(Integer i) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return i * i;
    }
}
useTime: 5015
[1, 4, 9, 16, 25]

普通招式2 節(jié)省時(shí)間 ??

public class Test20181129 {

    List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);

    @Test
    public void test1() {

        long begin = System.currentTimeMillis();

        //用于存放結(jié)果
        List<Integer> resultList = new LinkedList<>();

        //循環(huán)調(diào)用函數(shù)
        for (Integer integer :integerList) {
            resultList.add(fun(integer));
        }

        long end = System.currentTimeMillis();

        System.out.println("useTime: "+(end-begin));
        //輸出結(jié)果
        System.out.println(resultList);

    }

    private Integer fun(Integer i) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return i * i;
    }
}
useTime: 5009
[1, 4, 9, 16, 25]

stream 節(jié)省時(shí)間 ??????????

public class Test20181129 {

    List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);

    @Test
    public void test3() {

        long begin = System.currentTimeMillis();

        List<Integer> result = integerList.parallelStream().
                map(integer -> fun(integer)).
                collect(Collectors.toList());

        long end = System.currentTimeMillis();
        System.out.println(result);
        System.out.println("useTime : "+(end-begin));
    }

    public Integer fun(Integer integer)  {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return integer * integer;
    }
}
useTime : 1087
[1, 4, 9, 16, 25]

在造成相同傷害的基礎(chǔ)上(結(jié)果一致),stream的執(zhí)行時(shí)間只用了 普通招式1和2 的1/5
我們并沒有顯式的去開多線程,但是通過stream這一切就精巧的做完了。
這就是stream的魅力,接下來我會(huì)帶著大家一起看看stream都能幫我們做什么?以及如何避免反傷我們自己。

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,881評(píng)論 25 709
  • 這篇關(guān)于java stream的文章寫的特別好,轉(zhuǎn)載一下,以備自己查看。轉(zhuǎn)載自Java 8 中的 Streams ...
    小白小白啦閱讀 540評(píng)論 0 2
  • 打卡日期:2018/3/31 打卡累計(jì)天數(shù):29/30 宣言:學(xué)會(huì)管理自己的情緒,是給孩子最好的情緒課 加油小寶(...
    芳芳_f1a1閱讀 188評(píng)論 0 0
  • 1 傍晚,下班路上。 天氣冷颼颼的。海邊的風(fēng)帶著初春的寒氣,直往脖子里鉆。 匆匆行走的路人,都裹緊衣服,急急忙忙地...
    寬哥說閱讀 464評(píng)論 4 7

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