本文將介紹如何使用 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>
- myIdList.stream(): 將 ID 列表轉(zhuǎn)換為一個(gè) Stream 對(duì)象。
- Collectors.partitioningBy(myObjectMap::containsKey): 使用 partitioningBy 方法,并傳入 myObjectMap::containsKey 作為條件。myObjectMap::containsKey 是一個(gè)方法引用,等價(jià)于 id -> myObjectMap.containsKey(id),用于判斷 myObjectMap 中是否包含指定的 ID。
- partitioned.get(true): 獲取 myObjectMap 中存在的 ID 列表。
- .stream().map(myObjectMap::get).collect(Collectors.toList()): 將存在的 ID 列表轉(zhuǎn)換為 Stream 對(duì)象,然后使用 map 方法將每個(gè) ID 映射到對(duì)應(yīng)的對(duì)象,最后使用 collect 方法將映射后的對(duì)象收集到一個(gè)列表中。
- 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è)非常有用的工具。