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

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

本文介紹如何使用 Java Stream API 將數據流按照特定條件進行分區,并將分區后的數據分別收集到不同的集合中。通過 Collectors.partitioningBy 方法,可以高效地將數據流劃分為滿足條件和不滿足條件的兩部分,從而避免使用傳統的循環方式,簡化代碼并提高可讀性。

使用 partitioningBy 方法進行數據流分區

Java Stream API 提供了 Collectors.partitioningBy 方法,可以根據給定的 Predicate(斷言)將數據流劃分為兩個集合:一個集合包含所有滿足 Predicate 的元素,另一個集合包含所有不滿足 Predicate 的元素。

partitioningBy 方法返回一個 map>,其中 Boolean 類型的鍵表示元素是否滿足 Predicate,List 類型的值分別存儲滿足和不滿足 Predicate 的元素列表。

示例代碼:

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

假設我們有一個 ID 列表 myIdList 和一個將 ID 映射到對象的 Map myObjectMap。我們的目標是根據 ID 是否存在于 myObjectMap 中,將 ID 分成兩組:存在于 myObjectMap 中的 ID 對應的對象放入一個 List,不存在于 myObjectMap 中的 ID 放入另一個 List。

import java.util.*; 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. 創建數據: 首先,我們創建了一個包含字符串 ID 的列表 myIdList 和一個將字符串 ID 映射到對象的 Map myObjectMap。
  2. 使用 partitioningBy 分區: 我們使用 myIdList.stream() 創建一個流,然后使用 collect(Collectors.partitioningBy(myObjectMap::containsKey)) 將流分區。myObjectMap::containsKey 是一個方法引用,它作為 Predicate 傳遞給 partitioningBy 方法。 partitioningBy 方法會根據 myObjectMap 中是否包含某個 ID 作為鍵,將 myIdList 中的 ID 分成兩組。
  3. 獲取分區結果: partitioned 變量是一個 Map>,其中鍵為 true 的值是 myIdList 中存在于 myObjectMap 中的 ID 列表,鍵為 false 的值是 myIdList 中不存在于 myObjectMap 中的 ID 列表。
  4. 提取對象列表和缺失 ID 列表: 我們使用 partitioned.get(true).stream().map(myObjectMap::get).collect(Collectors.toList()) 從存在于 myObjectMap 中的 ID 列表中提取對應的對象,并將它們收集到一個新的 List objectList 中。 我們直接使用 partitioned.get(false) 獲取不存在于 myObjectMap 中的 ID 列表,并將它賦值給 missingObjIds 變量。
  5. 輸出結果: 最后,我們輸出 objectList 和 missingObjIds 的值。

輸出結果:

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

注意事項

  • partitioningBy 方法會遍歷整個數據流,因此對于大型數據流,性能可能會受到影響。
  • partitioningBy 方法返回的 Map 始終包含兩個鍵:true 和 false。即使數據流中的所有元素都滿足或都不滿足 Predicate,這兩個鍵仍然存在。

總結

Collectors.partitioningBy 方法是 Java Stream API 中一個強大的工具,可以用于將數據流按照特定條件進行分區,并將分區后的數據分別收集到不同的集合中。通過使用 partitioningBy 方法,可以簡化代碼并提高可讀性。然而,需要注意的是,partitioningBy 方法可能會影響性能,因此在處理大型數據流時需要謹慎使用。

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