使用Java Stream API分割数据流并获取两个不同的集合

使用Java Stream API分割数据流并获取两个不同的集合

本文将介绍如何使用Java Stream API处理数据流,并根据特定条件将其分割成两个不同的集合。通过partitioningBy方法,可以高效地将数据流划分为满足条件和不满足条件的两部分,分别存储到不同的列表中,避免了传统循环的繁琐。

使用 partitioningBy 方法分割数据流

Java Stream API 提供了 partitioningBy 方法,可以根据给定的 Predicate 函数将数据流分割成两个 List,一个 List 包含所有满足 Predicate 条件的元素,另一个 List 包含所有不满足 Predicate 条件的元素。 partitioningBy 方法返回一个 map>,其中 Key 为 Boolean 类型,True 对应满足条件的 List,False 对应不满足条件的 List。

示例代码

立即学习Java免费学习笔记(深入)”;

假设我们有一个 ID 列表 myIdList 和一个 Map myObjectMap,其中 ID 映射到对应的 Object。 我们需要遍历 ID 列表,如果 ID 存在于 Map 中,则将对应的 Object 添加到一个 List 中,否则将 ID 添加到另一个 List 中。

import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; 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. 数据准备:

    • myIdList: 包含需要处理的 ID 列表。
    • myObjectMap: 包含 ID 到 Object 的映射关系。
  2. 使用 partitioningBy 分割数据流:

    • myIdList.stream(): 创建一个包含 myIdList 中所有元素的 Stream。
    • collect(Collectors.partitioningBy(myObjectMap::containsKey)): 使用 partitioningBy 方法,以 myObjectMap::containsKey 作为 Predicate 函数分割 Stream。myObjectMap::containsKey 是一个方法引用,它检查 myObjectMap 是否包含给定的 ID。
    • partitioned: 结果是一个 Map>,Key 为 Boolean 类型,True 对应 myObjectMap 中存在的 ID 列表,False 对应 myObjectMap 中不存在的 ID 列表。
  3. 获取 Object 列表和缺失 ID 列表:

    • partitioned.get(true).stream(): 获取所有在 myObjectMap 中存在的 ID 列表的 Stream。
    • map(myObjectMap::get): 将 ID 映射到对应的 Object。
    • collect(Collectors.toList()): 将 Object 收集到 objectList 中。
    • partitioned.get(false): 获取所有在 myObjectMap 中不存在的 ID 列表,即缺失的 ID 列表,存储到 missingObjIds 中。
  4. 输出结果:

    • 打印 objectList 和 missingObjIds 的内容。

运行结果

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

注意事项

  • partitioningBy 方法将数据流分割成两个 List,因此会遍历数据流一次。
  • partitioningBy 方法返回的 Map 中的 Value 是 List 类型,因此可以方便地对分割后的数据进行后续处理。
  • 如果 myObjectMap 中不存在对应的 Object,map(myObjectMap::get) 会返回 NULL。 在实际应用中,需要根据具体情况处理 null 值。

总结

使用 Java Stream API 的 partitioningBy 方法可以方便地将数据流分割成两个不同的集合,提高了代码的可读性和简洁性。 该方法适用于需要根据条件将数据进行分类处理的场景。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享