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

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

本文將介紹如何使用 Java Stream API 有效地分割數據流,根據特定條件將元素劃分到不同的集合中。通過 partitioningBy 收集器,我們可以將數據流分割成兩個列表,分別包含滿足條件和不滿足條件的元素,從而避免使用傳統的循環結構,提高代碼的可讀性和簡潔性。

在實際開發中,我們經常需要根據某些條件將數據進行分類處理。例如,我們有一個 ID 列表和一個 ID 到對象的映射,需要將列表中存在于映射中的 ID 對應的對象放入一個列表,而將不存在于映射中的 ID 放入另一個列表。傳統的做法是使用循環遍歷列表,然后逐個判斷,代碼較為冗長。Java Stream API 提供了一種更簡潔、更高效的方式來實現這個需求。

使用 partitioningBy 收集器

Collectors.partitioningBy() 是一個非常有用的收集器,它可以根據給定的 Predicate(謂詞)將數據流分割成兩個列表。Predicate 是一個函數式接口,用于判斷元素是否滿足某個條件。partitioningBy 收集器返回一個 map>,其中 key 為 true 的列表包含滿足條件的元素,key 為 false 的列表包含不滿足條件的元素。

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

示例代碼

以下代碼演示了如何使用 partitioningBy 收集器來分割 ID 列表,并將對應的對象和缺失的 ID 分別放入不同的列表中:

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 到對象的映射 myObjectMap。
  2. 分割數據流: 使用 myIdList.stream().collect(Collectors.partitioningBy(myObjectMap::containsKey)) 將 ID 列表轉換為流,并使用 partitioningBy 收集器根據 myObjectMap::containsKey 謂詞進行分割。myObjectMap::containsKey 實際上是一個 Lambda 表達式,等價于 id -> myObjectMap.containsKey(id),它判斷 myObjectMap 中是否包含給定的 ID。
  3. 獲取對象列表: 使用 partitioned.get(true) 獲取包含存在于 myObjectMap 中的 ID 的列表,然后將其轉換為流,使用 map(myObjectMap::get) 將 ID 映射為對應的對象,最后使用 collect(Collectors.toList()) 將對象收集到 objectList 中。
  4. 獲取缺失的 ID 列表: 使用 partitioned.get(false) 獲取包含不存在于 myObjectMap 中的 ID 的列表,即缺失的 ID 列表。

輸出結果

運行上述代碼,將得到以下輸出:

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

注意事項

  • partitioningBy 收集器總是返回一個包含兩個列表的 Map,即使其中一個列表為空。
  • partitioningBy 收集器適用于需要將數據分割成兩部分的情況。如果需要將數據分割成多個部分,可以考慮使用 groupingBy 收集器。
  • 在上述示例中,我們使用了 myObjectMap::containsKey 作為謂詞,這是一種簡潔的寫法。實際上,我們可以使用任何返回 boolean 值的 Lambda 表達式作為謂詞。

總結

通過使用 Java Stream API 的 partitioningBy 收集器,我們可以方便地根據條件分割數據流,并將分割后的數據放入不同的集合中。這種方式可以避免使用傳統的循環結構,提高代碼的可讀性和簡潔性,使代碼更易于維護和擴展。雖然示例中的方法可能不是最高效的,但它展示了使用 Stream API 解決此類問題的一種有效途徑。在實際應用中,應根據具體情況選擇合適的解決方案。

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