Collectors.partitioningBy适用于过期/未过期的二元分类,基于Predicate判断expireTime是否小于当前时间,返回Map,true为过期数据,false为未过期数据,支持高效导出;多级分组需改用groupingBy。

用 Collectors.partitioningBy 对过期变量数据做二分分类(过期 / 未过期)非常高效,适合导出前的快速筛选,但要注意它只支持布尔谓词,不能直接处理多级状态或时间范围分组。
明确分区逻辑:用 Predicate 判断是否过期
核心是写一个准确判断“是否过期”的 Predicate<t></t>。通常基于时间字段(如 expireTime 或 lastModified),和当前时间比较:
- 假设数据类为
VariableData,含Long expireTime(毫秒时间戳) - 谓词示例:
data -> data.getExpireTime() - 注意时区与时间精度一致性,避免因系统时钟偏差误判
调用 partitioningBy 得到 Map>
流式处理后直接获得两个子列表,无需手动遍历或 if-else 拆分:
Map<Boolean, List<VariableData>> partitioned = dataList.stream()
.collect(Collectors.partitioningBy(data -> data.getExpireTime() < System.currentTimeMillis()));
-
partitioned.get(true)→ 所有过期数据(可用于导出“待清理”报表) -
partitioned.get(false)→ 所有未过期数据(可用于导出“有效变量清单”) - 返回的 Map 是
HashMap,键只有true和false两种,不会空指针(即使某类为空,对应 value 是空 List)
导出时按需选择并封装格式
分区后可分别处理,比如转 CSV、JSON 或写入 Excel:
- 导出过期数据:
exportToCsv(partitioned.get(true), "expired_variables.csv"); - 导出未过期数据:
exportToJson(partitioned.get(false), "active_variables.json"); - 若只需导出过期部分,不必构建完整 Map,可用
filter().toList()更轻量,但partitioningBy的优势在于一次流操作完成双向提取
进阶提示:结合 groupingBy 实现多维分类(如按过期天数分档)
如果需要“已过期0–7天”“已过期8–30天”等区间分类,partitioningBy 不适用,应改用 Collectors.groupingBy 配合自定义分类函数:
- 例如:
groupingBy(data -> daysPastExpire(data), mapping(...)) - 此时
partitioningBy仅适用于“是/否”型二元判断场景,勿强行用于多值分组

















