使用 Java Stream API 分割數(shù)據(jù)流并生成兩個(gè)不同的集合

使用 Java Stream API 分割數(shù)據(jù)流并生成兩個(gè)不同的集合

本文將介紹如何使用 Java Stream API 將一個(gè)數(shù)據(jù)流分割成兩個(gè)不同的集合。正如摘要所述,我們將利用 partitioningBy 方法,根據(jù)特定的條件將原始數(shù)據(jù)流分割成滿(mǎn)足條件和不滿(mǎn)足條件的兩部分。這種方法相較于傳統(tǒng)的循環(huán)方式,代碼更加簡(jiǎn)潔高效。

使用 partitioningBy 方法分割數(shù)據(jù)流

Collectors.partitioningBy() 是 Java Stream API 提供的一個(gè)非常強(qiáng)大的收集器。它接收一個(gè) Predicate 函數(shù)式接口作為參數(shù),該接口定義了一個(gè)測(cè)試條件,用于判斷流中的元素是否滿(mǎn)足條件。partitioningBy() 方法會(huì)根據(jù)這個(gè)條件將流中的元素分成兩部分:滿(mǎn)足條件的元素會(huì)被收集到一個(gè)列表中,不滿(mǎn)足條件的元素會(huì)被收集到另一個(gè)列表中。最終,partitioningBy() 方法會(huì)返回一個(gè) map>,其中 Boolean 類(lèi)型的鍵表示條件是否滿(mǎn)足(true 表示滿(mǎn)足,false 表示不滿(mǎn)足),List 類(lèi)型的值則分別存儲(chǔ)了滿(mǎn)足條件和不滿(mǎn)足條件的元素列表。

示例代碼

假設(shè)我們有一個(gè) ID 列表 myIdList 和一個(gè)將 ID 映射到對(duì)象的 Map myObjectMap。我們需要根據(jù) ID 是否存在于 myObjectMap 中,將 myIdList 分割成兩個(gè)列表:一個(gè)包含存在于 myObjectMap 中的 ID 對(duì)應(yīng)的對(duì)象,另一個(gè)包含 myObjectMap 中不存在的 ID。

以下是使用 partitioningBy 方法實(shí)現(xiàn)該功能的示例代碼:

立即學(xué)習(xí)Java免費(fèi)學(xué)習(xí)筆記(深入)”;

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);     } }

代碼解釋?zhuān)?/strong>

  1. myIdList.stream(): 將 ID 列表轉(zhuǎn)換為一個(gè) Stream 對(duì)象。
  2. Collectors.partitioningBy(myObjectMap::containsKey): 使用 partitioningBy 方法,并傳入 myObjectMap::containsKey 作為條件。myObjectMap::containsKey 是一個(gè)方法引用,等價(jià)于 id -> myObjectMap.containsKey(id),用于判斷 myObjectMap 中是否包含指定的 ID。
  3. partitioned.get(true): 獲取 myObjectMap 中存在的 ID 列表。
  4. .stream().map(myObjectMap::get).collect(Collectors.toList()): 將存在的 ID 列表轉(zhuǎn)換為 Stream 對(duì)象,然后使用 map 方法將每個(gè) ID 映射到對(duì)應(yīng)的對(duì)象,最后使用 collect 方法將映射后的對(duì)象收集到一個(gè)列表中。
  5. partitioned.get(false): 獲取 myObjectMap 中不存在的 ID 列表。

輸出結(jié)果:

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

注意事項(xiàng)

  • partitioningBy 方法返回的 Map 始終包含 true 和 false 兩個(gè)鍵,即使其中一個(gè)列表為空。
  • 如果 Predicate 條件的計(jì)算成本較高,可能會(huì)影響性能。在這種情況下,可以考慮使用其他方法來(lái)分割數(shù)據(jù)流。
  • myObjectMap::get 在stream的map操作中,如果map中不存在key值,則會(huì)返回NULL

總結(jié)

通過(guò)使用 Java Stream API 的 partitioningBy 方法,我們可以簡(jiǎn)潔高效地將一個(gè)數(shù)據(jù)流分割成兩個(gè)不同的集合。這種方法可以有效地減少代碼的冗余,提高代碼的可讀性和可維護(hù)性。在處理需要根據(jù)條件分割數(shù)據(jù)流的場(chǎng)景時(shí),partitioningBy 方法是一個(gè)非常有用的工具

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享