摘要:會在數(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 Streamstream = 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"}; Listlist = 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
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+forEachpublic class StreamStudy { public static void main(String[] args) throws Exception { String [] strArray = new String[] {"hello","java","python"}; Listlist = 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
public class StreamStudy { public static void main(String[] args) throws Exception { String [] strArray = new String[] {"hello","java","python"}; Listlist = 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
public class StreamStudy { public static void main(String[] args) throws Exception { String [] strArray = new String[] {"hello","java","python","node","react","vue"}; Listlist = 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
public class StreamStudy { public static void main(String[] args) throws Exception { String [] strArray = new String[] {"hello","java","python","node","react","vue","React"}; Listlist = 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
public class StreamStudy { public static void main(String[] args) throws Exception { String [] strArray = new String[] {"hello","java","python","node","react","vue","React"}; Listlist = 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
public class StreamStudy { public static void main(String[] args) throws Exception { String [] strArray = new String[] {"hello","java","python","node","react","vue","React"}; Listlist = 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去處理。
我們主要使用的是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遍歷
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77443.html
摘要:它的出現(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包...
摘要:雖然目前工作環(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為主,不過...
摘要:引言最近發(fā)現(xiàn)很多的新特性不熟悉,所以今天把它們都學(xué)習(xí)一邊,做出效果加深印象,說到還加了蠻多的特性,像一些的一些效果,動畫屬性等。 引言 最近發(fā)現(xiàn)很多css3的新特性不熟悉,所以今天把它們都學(xué)習(xí)一邊,做出效果加深印象,說到css3還加了蠻多的特性,像一些border的一些效果,動畫屬性animation trasiform等。 1.border-radius(邊框圓角) 效果 showI...
摘要:基礎(chǔ)語法變量提升都可以個難點(diǎn)在編譯時執(zhí)行并沒有報錯,執(zhí)行結(jié)果如圖注意結(jié)果沒有變更改結(jié)果值變了參考新特性未完一直更新 基礎(chǔ)語法 變量提升 //es5 var arr = []; for(var i=0; i
摘要:程序運(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...
閱讀 4306·2021-09-26 10:11
閱讀 2700·2021-07-28 00:37
閱讀 3244·2019-08-29 15:29
閱讀 1207·2019-08-29 15:23
閱讀 3154·2019-08-26 18:37
閱讀 2492·2019-08-26 10:37
閱讀 623·2019-08-23 17:04
閱讀 2372·2019-08-23 13:44