亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java集合Stream流操作的基本使用教程分享

 更新時間:2023年02月21日 11:36:08   作者:碼指星斗  
流操作并不會影響原來的集合,可以簡單認為,流操作是把集合中的一個元素逐個復制放到一個首尾相接的流動的水槽中。這篇文章整理了Stream流操作的基本使用,需要的可以參考一下

Java 中可以使用 java.util.Stream 對一個集合(實現了java.util.Collection接口的類)做各種操作,例如:求和、過濾、排序等等。

這些操作可能是中間操作——返回一個 Stream 流,或者是終端操作——返回一個結果。

流操作并不會影響原來的集合,可以簡單認為,流操作是把集合中的一個元素逐個復制放到一個首尾相接的流動的水槽中。

Stream 流支持同步執(zhí)行,也支持并發(fā)執(zhí)行。如果我們直接獲取 stream 流,得到的是同步執(zhí)行的 stream 流;如果調用方法 parallelStream,則得到一個可以并發(fā)執(zhí)行的 Stream 流。

注意:Map不支持 Stream 流,但是它的 KeyValue 支持,因為它們實現了 Set 接口。

事前準備

演示 Stream 流的提前準備,創(chuàng)建幾個類以供測試

  • 新建一個工具類,方便創(chuàng)建集合。
  • 新建兩個類,例如開發(fā)中常見的數據庫實體類和 DTO 類。
 public class MyUtil {
 ?
     private static List<String> list = new ArrayList<>();
     private static List<Student> students = new ArrayList<>();
 ?
     static {
         list.add("abc");
         list.add("xyz");
         list.add("fgh");
         list.add("abc");
         list.add("def");
         list.add("xyz");
         list.add("efg");
 ?
         Student s1 = new Student();
         s1.setAge("16");
         s1.setId(UUID.randomUUID().toString());
         s1.setName("張三");
         s1.setMajor("計算機科學與技術");
         Student s2 = new Student();
         s2.setAge("18");
         s2.setId(UUID.randomUUID().toString());
         s2.setName("李四");
         s2.setMajor("物聯(lián)網工程");
         Student s3 = new Student();
         s3.setAge("20");
         s3.setId(UUID.randomUUID().toString());
         s3.setName("王五");
         s3.setMajor("網絡工程");
         students.add(s1);
         students.add(s2);
         students.add(s3);
     }
 ?
     public static List<String> getList() {
         return list;
     }
     public static List<Student> getStudents() {
         return students;
     }
 }
 ?
 public class Student {
 ?
     private String id;
     private String name;
     private String age;
     private String major;
     
 }
 ?
 public class StudentDTO {
 ?
     private String name;
     private String major;
 }

Filter

filter 可以幫助我們過濾流中的某些元素,其方法簽名如下

 /*
 過濾操作,
 Predicate 相當于一個謂詞,即斷言流中的元素滿足某個條件,返回一個 布爾值
 */
 Stream<T> filter(Predicate<? super T> predicate);

具體使用方法如下:

 public class Main {
 ?
     public static void main(String[] args) {
         List<String> list = MyUtil.getList();
         System.out.println("過濾操作之前:");
         System.out.println(list);
         // 過濾不以 a 開頭的字符串,collect() 將流中的元素放到一個新的集合中
         List<String> newList = list.stream().filter(s -> !s.startsWith("a")).collect(Collectors.toList());
         System.out.println("-------------------------");
         System.out.println("過濾操作之后:");
         System.out.println(newList);
     }
 }
 ?
 ======== 輸出 =========
 過濾操作之前:
 [abc, xyz, fgh, abc, def, xyz, efg]
 -------------------------
 過濾操作之后:
 [xyz, fgh, def, xyz, efg]

Sorted

sorted 可以幫助我們排序流中的元素,方法簽名如下:

 /*
 中間操作,傳入一個 Comparator,對流中的元素進行排序,如果不傳入,則使用默認的 Comparable 排序
 對原集合不影響
 */
 Stream<T> sorted(Comparator<? super T> comparator);

具體使用方法如下:

 public class Main {
 ?
     public static void main(String[] args) {
         List<String> list = MyUtil.getList();
         System.out.println("排序操作之前:");
         System.out.println(list);
         List<String> newList = list.stream().sorted().collect(Collectors.toList());
         System.out.println("-------------------------");
         System.out.println("排序操作之后:");
         System.out.println(newList);
         System.out.println("自定義排序:");
         // 倒序排序。 forEach 方法可以用傳入的方法 逐個 處理流中的元素
         list.stream().sorted((s1, s2)-> -s1.compareTo(s2)).forEach(System.out::println);
     }
 }
 ?
 ======== 輸出 =========
 排序操作之前:
 [abc, xyz, fgh, abc, def, xyz, efg]
 -------------------------
 排序操作之后:
 [abc, abc, def, efg, fgh, xyz, xyz]
 自定義排序:
 xyz
 xyz
 fgh
 efg
 def
 abc
 abc

Map

Map 操作可以幫助我們將流中的一類元素映射為另一類元素,最典型的應用就是可以用來將數據庫實體類轉換為供前端使用的 DTO 類。方法簽名如下:

 /*
 中間操作,可以將一個對象轉化為另一個對象
 例如做 DTO 數據轉換
 */
 <R> Stream<R> map(Function<? super T, ? extends R> mapper);

具體使用方法如下:

 public class Main {
 ?
     public static void main(String[] args) {
         List<Student> students = MyUtil.getStudents();
         System.out.println("map 操作之前");
         System.out.println(students);
         // collect 方法可以將流中的元素收集到一個 Collection 中,如果有去除重復元素的需求,可以考慮收集到 Set 中
         List<StudentDTO> dtos = students.stream().map(student -> {
             StudentDTO dto = new StudentDTO();
             dto.setName(student.getName());
             dto.setMajor(student.getMajor());
             return dto;
         }).collect(Collectors.toList());
         System.out.println("-------------------------");
         System.out.println("map 操作之后");
         System.out.println(dtos);
     }
 }
 ?
 ======== 輸出 =========
 map 操作之前
 [Student{id='cb5726cd-e73a-443e-95e5-155aa6e876ae', name='張三', age='16', major='計算機科學與技術'}, Student{id='94478bae-b2ee-4c43-bac0-12f45f4099cd', name='李四', age='18', major='物聯(lián)網工程'}, Student{id='5fdd9e19-f7cf-4c61-b506-0ef58a36dcbe', name='王五', age='20', major='網絡工程'}]
 -------------------------
 map 操作之后
 [StudentDTO{name='張三', major='計算機科學與技術'}, StudentDTO{name='李四', major='物聯(lián)網工程'}, StudentDTO{name='王五', major='網絡工程'}]

Match

 /*
 終端操作,可以用來匹配操作,返回一個 boolean 值
 可以方便地匹配集合中是否存在某種元素
 */
 // 只要集合中有一個匹配,就返回 true
 boolean anyMatch(Predicate<? super T> predicate);
 // 集合中所有元素都匹配,才返回 true
 boolean allMatch(Predicate<? super T> predicate);
 // 集合中所有元素都不匹配,返回 true
 boolean noneMatch(Predicate<? super T> predicate);

具體使用方法如下:

 public class Main {
 ?
     public static void main(String[] args) {
         List<String> list = MyUtil.getList();
         System.out.println("集合中的所有元素是否都以 a 開頭");
         System.out.println(list.stream().allMatch(s -> s.startsWith("a")));
 ?
         System.out.println("集合中是否存在元素以 a 開頭");
         System.out.println(list.stream().anyMatch(s -> s.startsWith("a")));
 ?
         System.out.println("集合中的元素是否都不以 a 開頭(相當于 allMatch 的取反):");
         System.out.println(list.stream().noneMatch(s -> s.startsWith("a")));
     }
 }
 ?
 ======== 輸出 =========
 集合中的所有元素是否都以 a 開頭
 false
 集合中是否存在元素以 a 開頭
 true
 集合中的元素是否都不以 a 開頭(相當于 allMatch 的取反):
 false

Count

 /*
 終端操作,返回 stream 流中及集合中的元素個數,返回一個 long 類型
 */
 long count();

具體使用方法如下:

 public class Main {
 ?
     public static void main(String[] args) {
         List<String> list = MyUtil.getList();
         System.out.println(list);
         System.out.println("集合中的個數:" + list.size());
 ?
         long count = list.stream().filter(s -> s.startsWith("a")).count();
         System.out.println("集合中以 a 開頭的元素個數:" + count);
     }
 }
 ?
 ======== 輸出 =========
 [abc, xyz, fgh, abc, def, xyz, efg]
 集合中的個數:7
 集合中以 a 開頭的元素個數:2

Reduce

 /*
 終端操作,可以理解為減少集合的個數,對集合中的元素不斷進行累加,最終只得到一個元素
 Optional 包含一個對象,可以防止空指針異常
 */
 Optional<T> reduce(BinaryOperator<T> accumulator);

具體使用方法如下:

 public class Main {
 ?
     public static void main(String[] args) {
         List<String> list = MyUtil.getList();
         // 可以理解為減少集合的個數,對集合中的元素不斷進行累加,最終只得到一個元素
         // 例如對數字集合進行累加進行求和
         String s = list.stream().reduce((s1, s2) -> s1 + "###" + s2).get();
         System.out.println(s);
     }
 }
 ?
 ======== 輸出 =========
 abc###xyz###fgh###abc###def###xyz###efg

總結

可以看到,stream 流操作并沒有什么使用難度,但如果不熟悉 Lambda 表達式開發(fā)和函數引用,則使用起來可能會稍微吃力些。

置于并發(fā)流的使用,只需要使用集合的方法parallelStream(),就可以獲得一個并發(fā)流,在編寫代碼上基本和同步流沒什么區(qū)別,因此學會上面的基本用法基本足夠了,實際使用過程中,根據實際情況決定如何使用即可。

以上就是Java集合Stream流操作的基本使用教程分享的詳細內容,更多關于Java Stream流操作的資料請關注腳本之家其它相關文章!

相關文章

  • 解決Spring國際化文案占位符失效問題的方法

    解決Spring國際化文案占位符失效問題的方法

    本篇文章主要介紹了解決Spring國際化文案占位符失效問題的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • logback之自定義指定日志文件存儲目錄方式

    logback之自定義指定日志文件存儲目錄方式

    這篇文章主要介紹了logback之自定義指定日志文件存儲目錄方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 寶塔面板配置及部署javaweb教程(全網最全)

    寶塔面板配置及部署javaweb教程(全網最全)

    這篇文章主要介紹了寶塔面板配置及部署javaweb教程(全網最全),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java數據類型轉換的示例詳解

    Java數據類型轉換的示例詳解

    Java程序中要求參與的計算的數據,必須要保證數據類型的一致性,如果數據類型不一致將發(fā)生類型的轉換。本文將通過示例詳細說說Java中數據類型的轉換,感興趣的可以了解一下
    2022-10-10
  • Java中對象?和?json?互轉四種方式?json-lib、Gson、FastJson、Jackson

    Java中對象?和?json?互轉四種方式?json-lib、Gson、FastJson、Jackson

    這篇文章主要介紹了Java中對象?和?json?互轉?四種方式?json-lib、Gson、FastJson、Jackson,需要的朋友可以參考下
    2023-11-11
  • Java源碼跟蹤閱讀技巧【值得收藏】

    Java源碼跟蹤閱讀技巧【值得收藏】

    今天跟大家分享一下我平時閱讀源碼的幾個小技巧,對于閱讀Java中間件如Spring、Dubbo等框架源碼的同學有一定幫助。本文基于Eclipse IDE,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • 快速入門Java中的Lambda表達式

    快速入門Java中的Lambda表達式

    Lambda作為函數式編程中的基礎部分,在其他編程語言中早就廣為使用,但在Java領域中發(fā)展較慢,直到java8,才開始支持Lambda。網上關于Lambda的教程很多,今天小編給大家分享一篇快速入手Lambda的教程。
    2016-08-08
  • Java CRM系統(tǒng)用戶登錄功能實現代碼實例

    Java CRM系統(tǒng)用戶登錄功能實現代碼實例

    這篇文章主要介紹了Java CRM系統(tǒng)用戶登錄功能實現代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java面向對象編程(封裝/繼承/多態(tài))實例解析

    Java面向對象編程(封裝/繼承/多態(tài))實例解析

    這篇文章主要介紹了Java面向對象編程(封裝/繼承/多態(tài))實例解析的相關內容,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Java8 LocalDateTime極簡時間日期操作小結

    Java8 LocalDateTime極簡時間日期操作小結

    這篇文章主要介紹了Java8-LocalDateTime極簡時間日期操作整理,通過實例代碼給大家介紹了java8 LocalDateTime 格式化問題,需要的朋友可以參考下
    2020-04-04

最新評論