使用Java Stream API分割數據流并獲取兩個不同的集合

使用Java Stream API分割數據流并獲取兩個不同的集合

本文將介紹如何使用Java Stream API處理數據流,并根據特定條件將其分割成兩個不同的集合。通過partitioningBy方法,可以高效地將數據流劃分為滿足條件和不滿足條件的兩部分,分別存儲到不同的列表中,避免了傳統循環的繁瑣。

使用 partitioningBy 方法分割數據流

Java Stream API 提供了 partitioningBy 方法,可以根據給定的 Predicate 函數將數據流分割成兩個 List,一個 List 包含所有滿足 Predicate 條件的元素,另一個 List 包含所有不滿足 Predicate 條件的元素。 partitioningBy 方法返回一個 map>,其中 Key 為 Boolean 類型,True 對應滿足條件的 List,False 對應不滿足條件的 List。

示例代碼

立即學習Java免費學習筆記(深入)”;

假設我們有一個 ID 列表 myIdList 和一個 Map myObjectMap,其中 ID 映射到對應的 Object。 我們需要遍歷 ID 列表,如果 ID 存在于 Map 中,則將對應的 Object 添加到一個 List 中,否則將 ID 添加到另一個 List 中。

import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors;  public class StreamPartitioning {      public static void main(String[] args) {         List<String> myIdList = Arrays.asList("a", "b", "c");         Map<String, Object> myObjectMap = new HashMap<>();         myObjectMap.put("b", "B");          Map<Boolean, List<String>> partitioned = myIdList.stream()                 .collect(Collectors.partitioningBy(myObjectMap::containsKey));          List<Object> objectList = partitioned.get(true).stream()                 .map(myObjectMap::get)                 .collect(Collectors.toList());         List<String> missingObjIds = partitioned.get(false);          System.out.println("objectList=" + objectList);         System.out.println("missingObjIds=" + missingObjIds);     } }

代碼解釋

  1. 數據準備:

    • myIdList: 包含需要處理的 ID 列表。
    • myObjectMap: 包含 ID 到 Object 的映射關系。
  2. 使用 partitioningBy 分割數據流:

    • myIdList.stream(): 創建一個包含 myIdList 中所有元素的 Stream。
    • collect(Collectors.partitioningBy(myObjectMap::containsKey)): 使用 partitioningBy 方法,以 myObjectMap::containsKey 作為 Predicate 函數分割 Stream。myObjectMap::containsKey 是一個方法引用,它檢查 myObjectMap 是否包含給定的 ID。
    • partitioned: 結果是一個 Map>,Key 為 Boolean 類型,True 對應 myObjectMap 中存在的 ID 列表,False 對應 myObjectMap 中不存在的 ID 列表。
  3. 獲取 Object 列表和缺失 ID 列表:

    • partitioned.get(true).stream(): 獲取所有在 myObjectMap 中存在的 ID 列表的 Stream。
    • map(myObjectMap::get): 將 ID 映射到對應的 Object。
    • collect(Collectors.toList()): 將 Object 收集到 objectList 中。
    • partitioned.get(false): 獲取所有在 myObjectMap 中不存在的 ID 列表,即缺失的 ID 列表,存儲到 missingObjIds 中。
  4. 輸出結果:

    • 打印 objectList 和 missingObjIds 的內容。

運行結果

objectList=[B] missingObjIds=[a, c]

注意事項

  • partitioningBy 方法將數據流分割成兩個 List,因此會遍歷數據流一次。
  • partitioningBy 方法返回的 Map 中的 Value 是 List 類型,因此可以方便地對分割后的數據進行后續處理。
  • 如果 myObjectMap 中不存在對應的 Object,map(myObjectMap::get) 會返回 NULL。 在實際應用中,需要根據具體情況處理 null 值。

總結

使用 Java Stream API 的 partitioningBy 方法可以方便地將數據流分割成兩個不同的集合,提高了代碼的可讀性和簡潔性。 該方法適用于需要根據條件將數據進行分類處理的場景。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享