本文介紹如何使用 Java Stream API 將數據流按照特定條件進行分區,并將分區后的數據分別收集到不同的集合中。通過 Collectors.partitioningBy 方法,可以高效地將數據流劃分為滿足條件和不滿足條件的兩部分,從而避免使用傳統的循環方式,簡化代碼并提高可讀性。
使用 partitioningBy 方法進行數據流分區
Java Stream API 提供了 Collectors.partitioningBy 方法,可以根據給定的 Predicate(斷言)將數據流劃分為兩個集合:一個集合包含所有滿足 Predicate 的元素,另一個集合包含所有不滿足 Predicate 的元素。
partitioningBy 方法返回一個 map
示例代碼:
立即學習“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); } }
代碼解釋:
- 創建數據: 首先,我們創建了一個包含字符串 ID 的列表 myIdList 和一個將字符串 ID 映射到對象的 Map myObjectMap。
- 使用 partitioningBy 分區: 我們使用 myIdList.stream() 創建一個流,然后使用 collect(Collectors.partitioningBy(myObjectMap::containsKey)) 將流分區。myObjectMap::containsKey 是一個方法引用,它作為 Predicate 傳遞給 partitioningBy 方法。 partitioningBy 方法會根據 myObjectMap 中是否包含某個 ID 作為鍵,將 myIdList 中的 ID 分成兩組。
- 獲取分區結果: partitioned 變量是一個 Map
>,其中鍵為 true 的值是 myIdList 中存在于 myObjectMap 中的 ID 列表,鍵為 false 的值是 myIdList 中不存在于 myObjectMap 中的 ID 列表。 - 提取對象列表和缺失 ID 列表: 我們使用 partitioned.get(true).stream().map(myObjectMap::get).collect(Collectors.toList()) 從存在于 myObjectMap 中的 ID 列表中提取對應的對象,并將它們收集到一個新的 List objectList 中。 我們直接使用 partitioned.get(false) 獲取不存在于 myObjectMap 中的 ID 列表,并將它賦值給 missingObjIds 變量。
- 輸出結果: 最后,我們輸出 objectList 和 missingObjIds 的值。
輸出結果:
objectList=[B] missingObjIds=[a, c]
注意事項
- partitioningBy 方法會遍歷整個數據流,因此對于大型數據流,性能可能會受到影響。
- partitioningBy 方法返回的 Map 始終包含兩個鍵:true 和 false。即使數據流中的所有元素都滿足或都不滿足 Predicate,這兩個鍵仍然存在。
總結
Collectors.partitioningBy 方法是 Java Stream API 中一個強大的工具,可以用于將數據流按照特定條件進行分區,并將分區后的數據分別收集到不同的集合中。通過使用 partitioningBy 方法,可以簡化代碼并提高可讀性。然而,需要注意的是,partitioningBy 方法可能會影響性能,因此在處理大型數據流時需要謹慎使用。