Java Stream流零基礎教程
一、Stream流介紹
在JDK8時,JAVA新增了lambda表達式,它與 java.io 包里的 InputStream和 OutputStream是完全不同的概念,他更跟流沒有任何關系。它也不同于 StAX 對 XML解析的 Stream,也不是 Amazon Kinesis 對大數(shù)據(jù)實時處理的Stream。
JDK8 中的 Stream 是對集合(Collection)對象功能的增強,它借助于lambda表達式,更優(yōu)雅的表達風格,極大的提高編程效率和程序可讀性。它針對于對集合對象進行各種非常便利、高效的聚合操作,或者大批量數(shù)據(jù)操作。不多說,上用法。
二、Stream流實現(xiàn)與傳統(tǒng)方式實現(xiàn)對比
**案例:**找出列表中包含張三且姓名長度為2的名字
2.1、傳統(tǒng)方式實現(xiàn)
package com.controller; import java.util.ArrayList; public class Aoo { public static void main(String[] args) { // 1.定義一個集合 ArrayList<String> list = new ArrayList<>(); list.add("張三"); list.add("張四"); list.add("四"); list.add("張四"); list.add("張四"); list.add("張四"); list.add("張四"); // 2.挑選list中包含張三的 ArrayList<String> list1 = new ArrayList<>(); for (String s : list) { if (s.startsWith("張三")){ list1.add(s); } } System.out.println("挑選list包含張三的結果:"+list1); // 3.再從list1中挑選挑選名字長度為2的 ArrayList<String> list2 = new ArrayList<>(); for (String s : list1) { if (s.length() == 2){ list2.add(s); } } System.out.println("挑選list1長度為2的結果:"+list2); // 4、遍歷 for (String s : list2) { System.out.println("最終結果 = " + s); } } }
2.2、Stream流方式實現(xiàn)
package com.controller; import java.util.ArrayList; public class Boo { public static void main(String[] args) { // 定義一個集合,并填入數(shù)據(jù) ArrayList<String> list = new ArrayList<>(); list.add("張三"); list.add("李四"); list.add("李四"); list.add("李四"); list.add("王五"); list.add("王五"); list.add("王五"); //Stream流的實現(xiàn) list.stream() .filter((name) -> name.startsWith("張三")) .filter((name) -> name.length()==2) .forEach((name) -> System.out.println(name)); } }
三、Stream流的常用API
3.1、stream流的獲取
在Collection集合下,均有一個stream(),另一個即是用Stream的一個靜態(tài)方法 of() 實現(xiàn)。
上代碼:
package com.controller; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.stream.Stream; public class Boo { public static void main(String[] args) { //Collction集合 Collection<String> collection = new ArrayList(); Stream<String> stream = collection.stream(); //List集合 List<String> list = new ArrayList<>(); Stream<String> stream1 = list.stream(); //ArrayList集合 ArrayList<String> arrayList = new ArrayList<>(); Stream<String> stream2 = arrayList.stream(); //LinkedList集合 LinkedList<String> linkedList = new LinkedList<>(); Stream<String> stream3 = linkedList.stream(); //of()方式的實現(xiàn) List<String> list1 = new ArrayList<>(); Stream<List<String>> stream4 = Stream.of(list1); //傳入可變數(shù)組 Stream<String> stream5 = Stream.of("1","2","3","4"); } }
3.2、forEach()
遍歷流中的對象
package com.controller; import java.util.ArrayList; public class Aoo { public static void main(String[] args) { // 定義一個集合 ArrayList<String> list = new ArrayList<>(); list.add("張三"); list.add("李四"); list.add("李四"); list.add("李四"); list.add("李四"); list.add("李四"); list.add("李四"); //遍歷流的對象 list.stream().forEach((name) -> System.out.println(name)); } }
3.3、filter()
filter對流對象進行過濾操作
package com.controller; import java.util.ArrayList; public class Aoo { public static void main(String[] args) { // 定義一個集合 ArrayList<String> list = new ArrayList<>(); list.add("張三"); list.add("李四二"); list.add("李四我"); list.add("李四去晚"); list.add("李四請問"); list.add("李四去"); list.add("李四我"); //過濾流的對象 list.stream().filter((name) -> name.length()==2); } }
3.4、map()
map()是對集合中的對象進行映射的,將對象從一種類型轉換成另一種類型
package com.controller; import java.util.ArrayList; public class Aoo { public static void main(String[] args) { // 定義一個集合 ArrayList<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("6"); list.add("7"); //map()是對集合中的對象進行映射的,將對象從一種類型轉換成另一種類型 list.stream().map(num -> Integer.parseInt(num)); } }
3.5、count()
count是對流數(shù)據(jù)統(tǒng)計的方法,但是count之后返回的是long類型,因此無法再進行流操作。
package com.controller; import java.util.ArrayList; public class Aoo { public static void main(String[] args) { // 定義一個集合 ArrayList<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("6"); list.add("7"); //count()對流數(shù)據(jù)進行統(tǒng)計 System.out.println(list.stream().count()); } } 3.6、limit()
3.6、limit()
選取流數(shù)據(jù)的前多少條數(shù)據(jù)
package com.controller; import java.util.ArrayList; public class Aoo { public static void main(String[] args) { // 定義一個集合 ArrayList<String> list = new ArrayList<>(); list.add("李二1"); list.add("李二2"); list.add("李二3"); list.add("李二4"); list.add("李二5"); list.add("李二6"); list.add("李二7"); //limit() 選取流數(shù)據(jù)的前多少條數(shù)據(jù) list.stream().limit(2); } }
3.7、skip()
跳過流數(shù)據(jù)的前多少條數(shù)據(jù),該方法與limit()方法剛好相反
package com.controller; import java.util.ArrayList; public class Aoo { public static void main(String[] args) { // 定義一個集合 ArrayList<String> list = new ArrayList<>(); list.add("李小龍1"); list.add("李小龍2"); list.add("李小龍3"); list.add("李小龍4"); list.add("李小龍5"); list.add("李小龍6"); list.add("李小龍7"); //skip() 跳過流數(shù)據(jù)的前多少條數(shù)據(jù) list.stream().skip(2); } }
3.8、concat()
Stream的靜態(tài)方法concat()實現(xiàn)對兩個流數(shù)據(jù)進行合并
package com.controller; import java.util.ArrayList; import java.util.stream.Stream; public class Aoo { public static void main(String[] args) { // 定義一個集合 ArrayList<String> list = new ArrayList<>(); list.add("張三豐1"); list.add("張三豐2"); list.add("張三豐3"); list.add("張三豐4"); list.add("張三豐5"); list.add("張三豐6"); list.add("張三豐7"); // 定義一個集合 ArrayList<String> list1 = new ArrayList<>(); list1.add("1"); list1.add("2"); list1.add("3"); list1.add("4"); list1.add("5"); list1.add("6"); list1.add("7"); //concat()實現(xiàn)對兩個流數(shù)據(jù)進行合并 Stream.concat(list.stream(),list1.stream()); } }
四、總結
Stream 使用一種類似用 SQL 語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。Stream API可以極大提高Java程序員的生產(chǎn)力,讓
程序員寫出高效率、干凈、簡潔的代碼。這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節(jié)點上進行處理, 比如篩選, 排序,聚合等。
到此這篇關于Java Stream流零基礎教程的文章就介紹到這了,更多相關Java Stream流內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Java實現(xiàn)動態(tài)生成MySQL數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)動態(tài)生成MySQL數(shù)據(jù)庫,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-02-02JAVA中使用FileWriter寫數(shù)據(jù)到文本文件步驟詳解
這篇文章主要介紹了JAVA中使用FileWriter寫數(shù)據(jù)到文本文件步驟詳解,FileWriter類提供了多種寫入字符的方法,包括寫入單個字符、寫入字符數(shù)組和寫入字符串等,它還提供了一些其他的方法,如刷新緩沖區(qū)、關閉文件等,需要的朋友可以參考下2023-10-10java集合PriorityQueue優(yōu)先級隊列方法實例
這篇文章主要為大家介紹了java集合PriorityQueue優(yōu)先級隊列方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Spring Boot實現(xiàn)功能的統(tǒng)一詳解
這篇文章主要介紹了Spring Boot統(tǒng)一功能的處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06MyBatis注解方式之@Update/@Delete使用詳解
這篇文章主要介紹了MyBatis注解方式之@Update/@Delete使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11