成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JDK 1.8 新特性學(xué)習(xí)(Stream)

yhaolpz / 2169人閱讀

摘要:會在數(shù)據(jù)源內(nèi)部隱式的遍歷進(jìn)行處理。會并行遍歷數(shù)據(jù),將數(shù)據(jù)分成若干段,同時進(jìn)行處理,最終匯總結(jié)果一起輸出。結(jié)束操作會觸發(fā)實際計算,計算發(fā)生時會把所有中間操作積攢的操作以的方式執(zhí)行,這樣可以減少迭代次數(shù)。為函數(shù)式編程而生。

Stream實現(xiàn)了對數(shù)據(jù)源的流式處理,它可以并行操作,提高數(shù)據(jù)處理效率。
什么是流

流不是集合,它不對數(shù)據(jù)做保存,只是最數(shù)據(jù)進(jìn)行算法處理,比如最大值,最小值,排序等操作。Stream會在數(shù)據(jù)源內(nèi)部隱式的遍歷進(jìn)行處理。Stream會并行遍歷數(shù)據(jù),將數(shù)據(jù)分成若干段,同時進(jìn)行處理,最終匯總結(jié)果一起輸出。

Stream 就如同一個迭代器(Iterator),單向,不可往復(fù),數(shù)據(jù)只能遍歷一次,遍歷過一次后即用盡了,就好比流水從面前流過,一去不復(fù)返。

特點(diǎn)

首先對stream的操作可以分為兩類,中間操作(intermediate operations)和結(jié)束操作(terminal operations):

中間操作總是會惰式執(zhí)行,調(diào)用中間操作只會生成一個標(biāo)記了該操作的新stream。

結(jié)束操作會觸發(fā)實際計算,計算發(fā)生時會把所有中間操作積攢的操作以pipeline的方式執(zhí)行,這樣可以減少迭代次數(shù)。計算完成之后stream就會失效。

無存儲。stream不是一種數(shù)據(jù)結(jié)構(gòu),它只是某種數(shù)據(jù)源的一個視圖,數(shù)據(jù)源可以是一個數(shù)組,Java容器或I/O channel等。

為函數(shù)式編程而生。對stream的任何修改都不會修改背后的數(shù)據(jù)源,比如對stream執(zhí)行過濾操作并不會刪除被過濾的元素,而是會產(chǎn)生一個不包含被過濾元素的新stream。

惰式執(zhí)行。stream上的操作并不會立即執(zhí)行,只有等到用戶真正需要結(jié)果的時候才會執(zhí)行。

可消費(fèi)性。stream只能被“消費(fèi)”一次,一旦遍歷過就會失效,就像容器的迭代器那樣,想要再次遍歷必須重新生成。

使用方法 1.構(gòu)造流的方法
public class StreamStudy {
    
    public static void main(String[] args) throws Exception {
        //1. of
        Stream stream  = Stream.of("hello","java","python");
        // 2. Arrays
        String [] strArray = new String[] {"hello","java","python"};
        stream = Stream.of(strArray);
        stream = Arrays.stream(strArray);
        // 3. Collections
        List list = Arrays.asList(strArray);
        stream = list.stream();
        System.out.println(stream.findAny());
    }

}

最終只返回第一個結(jié)果: Optional[hello]

2. 流轉(zhuǎn)換為其它數(shù)據(jù)結(jié)構(gòu)
public class StreamStudy {
    
    public static void main(String[] args) throws Exception {
        String [] strArray = new String[] {"hello","java","python"};
        List list = Arrays.asList(strArray);
        // to array
        System.out.println(list.stream().toArray()[0]);
        // to list
        System.out.println(list.stream().collect(Collectors.toList()));
        // to string
        System.out.println(list.stream().collect(Collectors.joining()).toString());
    }

}

輸出:
hello
[hello, java, python]
hellojavapython

3. 流的操作

Intermediate (map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered)

Terminal(forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator)

Short-circuiting(anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit)

一個流可以后面跟隨零個或多個 intermediate 操作。其目的主要是打開流,做出某種程度的數(shù)據(jù)映射/過濾,然后返回一個新的流,交給下一個操作使用。這類操作都是惰性化的(lazy),就是說,僅僅調(diào)用到這類方法,并沒有真正開始流的遍歷。

一個流只能有一個 terminal 操作,當(dāng)這個操作執(zhí)行后,流就被使用“光”了,無法再被操作。所以這必定是流的最后一個操作。Terminal 操作的執(zhí)行,才會真正開始流的遍歷,并且會生成一個結(jié)果,或者一個 side effect。

4.基礎(chǔ)的使用 1.map+forEach
public class StreamStudy {
    
    public static void main(String[] args) throws Exception {
        String [] strArray = new String[] {"hello","java","python"};
        List list = Arrays.asList(strArray);
        list.stream().map((v) ->v.toUpperCase())
        .forEach(t -> System.out.println(t));
    }

}

將list中的所有字母轉(zhuǎn)換成大寫,然后遍歷輸出?!嶋Hlist中的值并沒有改變,我們只是借助Stream來做業(yè)務(wù)處理。
輸出?。?br>HELLO
JAVA
PYTHON

2.filter+map+forEach
public class StreamStudy {
    
    public static void main(String[] args) throws Exception {
        String [] strArray = new String[] {"hello","java","python"};
        List list = Arrays.asList(strArray);
        list.stream().filter(f -> f.length()>4)
        .map(v ->v.toUpperCase())
        .forEach(t -> System.out.println(t));
    }

}

先filter過濾,然后map字母大寫,最后forEach輸出結(jié)果:
HELLO
PYTHON

3. filter+sorted+map+forEach
public class StreamStudy {
    
    public static void main(String[] args) throws Exception {
        String [] strArray = new String[] {"hello","java","python","node","react","vue"};
        List list = Arrays.asList(strArray);
        list.stream().filter(f -> f.length()>3)
        .sorted((a,b) -> b.compareTo(a))
        .map(v ->v.toUpperCase())
        .forEach(t -> System.out.println(t));
    }

}

先filter過濾,然后sorted排序,然后map字母大寫,最后forEach輸出結(jié)果:
REACT
PYTHON
NODE
JAVA
HELLO

4. filter+sorted+map+distinct+forEach
public class StreamStudy {
    
    public static void main(String[] args) throws Exception {
        String [] strArray = new String[] {"hello","java","python","node","react","vue","React"};
        List list = Arrays.asList(strArray);
        list.stream().filter(f -> f.length()>3)
        .sorted((a,b) -> b.compareTo(a))
        .map(v ->v.toUpperCase())
        .distinct()
        .forEach(t -> System.out.println(t));
    }

}

distinct去重,使用 Object.equals(Object)來判斷是否重復(fù),最終只留下一個REACT,結(jié)果:
REACT
PYTHON
NODE
JAVA
HELLO

5. filter+sorted+map+distinct+limit+forEach
public class StreamStudy {
    
    public static void main(String[] args) throws Exception {
        String [] strArray = new String[] {"hello","java","python","node","react","vue","React"};
        List list = Arrays.asList(strArray);
        list.stream().filter(f -> f.length()>3)
        .sorted((a,b) -> b.compareTo(a))
        .map(v ->v.toUpperCase())
        .distinct()
        .limit(3)
        .forEach(t -> System.out.println(t));
    }

}

limit限制元素個數(shù),這里著要前3個結(jié)果:
REACT
PYTHON
NODE

6.filter+sorted+map+distinct+limit+peek+forEach
public class StreamStudy {
    
    public static void main(String[] args) throws Exception {
        String [] strArray = new String[] {"hello","java","python","node","react","vue","React"};
        List list = Arrays.asList(strArray);
        list.stream().filter(f -> f.length()>3)
        .sorted((a,b) -> b.compareTo(a))
        .map(v ->v.toUpperCase())
        .distinct()
        .limit(3)
        .peek(p -> p.toLowerCase())
        .forEach(t -> System.out.println(t));
        
    }

}

peek會對每個元素執(zhí)行操作,并返回包含原stream元素的新Stream,什么意思呢?先看結(jié)果:
REACT
PYTHON
NODE
并不是我們看到的小寫,因為peek產(chǎn)生的新的stream并不是我們已開始處理的Stream,所以我們看到的還是大寫。如果你的處理過程中涉及一些額外邏輯,但不影響最終結(jié)果,那么你可以使用peek去搞一個新的Stream去處理。

7.總結(jié)

我們主要使用的是Intermediate 中的方法進(jìn)行數(shù)據(jù)處理,Terminal 中的方法只能使用一個,這意味著對流的處理終止,這時才開始執(zhí)行前面的那些Intermediate方法。最后對一些方法作一些解釋,就不一一演示了:
forEach遍歷、 forEachOrdered按順序遍歷、 toArray結(jié)果轉(zhuǎn)換成數(shù)組、 reduce結(jié)果中的元素進(jìn)行組合、 collect結(jié)果轉(zhuǎn)換成集合、 min結(jié)果中最小值、 max結(jié)果中最大值、 count結(jié)果中元素數(shù)量、 anyMatch結(jié)果中存在元素滿足某一條件、 allMatch結(jié)果中所有元素都滿足某一條件、 noneMatch結(jié)果中所有元素都不滿足某一條件、 findFirst結(jié)果中第一條數(shù)據(jù) 、 findAny結(jié)果中的任意一條數(shù)據(jù)、 iterator遍歷

歡迎關(guān)注我的公眾號mike啥都想搞,有更多教程資料相送。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77443.html

相關(guān)文章

  • Jdk1.8新特學(xué)習(xí)(Optional)

    摘要:它的出現(xiàn)是為我們解決空指針異常的,以前我們寫代碼如果不進(jìn)行判斷,會經(jīng)常出現(xiàn)異常。因為它本身就是個對象,不管放進(jìn)去的對象為不為,始終不會返回,所以你也不需要在你的業(yè)務(wù)流程中進(jìn)行一大堆的判斷,避免了程序運(yùn)行時的空指針異常。 想必大家已經(jīng)在使用jdk1.8做項目開發(fā),但是你對于它里面的一些性特性了解多少呢?有沒有在你的項目中運(yùn)用呢?現(xiàn)在就和我來一起梳理一下吧。 介紹 它是java.util包...

    liaosilzu2007 評論0 收藏0
  • Java8新特學(xué)習(xí)筆記

    摘要:雖然目前工作環(huán)境仍然以為主,不過目前已是大勢所趨了。標(biāo)準(zhǔn)函數(shù)式接口新的包定義旨在使用的廣泛函數(shù)式接口。這一改進(jìn)使得擁有了類似于多繼承的能力。 從Java8發(fā)布到現(xiàn)在有好幾年了,而Java9也提上發(fā)布日程了(沒記錯的話好像就是這個月2017年7月,也許會再度跳票吧,不過沒關(guān)系,穩(wěn)定大于一切,穩(wěn)定了再發(fā)布也行),現(xiàn)在才開始去真正學(xué)習(xí),說來也是慚愧。雖然目前工作環(huán)境仍然以Java6為主,不過...

    wthee 評論0 收藏0
  • CSS3新特學(xué)習(xí)

    摘要:引言最近發(fā)現(xiàn)很多的新特性不熟悉,所以今天把它們都學(xué)習(xí)一邊,做出效果加深印象,說到還加了蠻多的特性,像一些的一些效果,動畫屬性等。 引言 最近發(fā)現(xiàn)很多css3的新特性不熟悉,所以今天把它們都學(xué)習(xí)一邊,做出效果加深印象,說到css3還加了蠻多的特性,像一些border的一些效果,動畫屬性animation trasiform等。 1.border-radius(邊框圓角) 效果 showI...

    wing324 評論0 收藏0
  • Es6新特學(xué)習(xí)

    摘要:基礎(chǔ)語法變量提升都可以個難點(diǎn)在編譯時執(zhí)行并沒有報錯,執(zhí)行結(jié)果如圖注意結(jié)果沒有變更改結(jié)果值變了參考新特性未完一直更新 基礎(chǔ)語法 變量提升 //es5 var arr = []; for(var i=0; i

    AlphaWallet 評論0 收藏0
  • Java learn 01 Java basic

    摘要:程序運(yùn)行機(jī)制兩種核心機(jī)制垃圾收集機(jī)制虛擬機(jī)可以理解成一個以字節(jié)碼為機(jī)器指令的虛擬機(jī)機(jī)制屏蔽了底層運(yùn)行平臺的差別實現(xiàn)了一次編譯隨處運(yùn)行。采用編碼全球語言統(tǒng)一編碼每個字符占兩個字節(jié)面向過程約瑟夫環(huán)面向?qū)ο蠹s瑟夫環(huán) Chap 0 Preface Java Basic Content List Java data type、 標(biāo)識符、運(yùn)算符、表達(dá)式和語句、分支、循環(huán)、方法 OO Except...

    EastWoodYang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<