如何使用Java Stream从嵌套数组中筛选type为S/A的最小日期对象
正确Java Stream实现方案
import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; // 核心逻辑,你的原有类和日期转换工具方法无需修改 public HashMap<String, PojoClass> getLowestDateOfTypeSandA(List<MainData> mainDataList) { return mainDataList.stream() // 取出每个MainData对应的SubData .map(MainData::getSubData) // 扁平化操作:把所有SubData内嵌的PojoList展开为统一的PojoClass流 .flatMap(subData -> subData.getPojoList().stream()) // 筛选仅type为S或A的记录 .filter(pojo -> { String type = pojo.getType(); return "S".equals(type) || "A".equals(type); }) // 按type分组,每组保留日期最小的对象,最终转为HashMap返回 .collect(Collectors.collectingAndThen( Collectors.toMap( PojoClass::getType, Function.identity(), // 合并规则:对比两个同type对象的日期,保留日期更小的对象 (pojo1, pojo2) -> { Date date1 = convertXMLGregorianCalendarToDate(pojo1.getdate()); Date date2 = convertXMLGregorianCalendarToDate(pojo2.getdate()); return date1.after(date2) ? pojo2 : pojo1; } ), HashMap::new )); }
注意事项
- 注意
PojoClass的日期getter方法名为小写开头的getdate(),如果你的实际项目中遵循Java规范命名为getDate(),请对应修改代码中的方法调用。 - 筛选逻辑采用
"S".equals(type)的写法,可避免type为null时触发空指针异常。 - 用
Date.after()做日期对比,比直接比较时间戳可读性更高,也避免了XMLGregorianCalendar直接转long的潜在格式问题。
可选空值兼容优化
如果业务场景中可能出现SubData为null、pojoList为null的情况,可以调整中间逻辑避免空指针:
.map(MainData::getSubData) .filter(Objects::nonNull) // 过滤为null的SubData .flatMap(subData -> Optional.ofNullable(subData.getPojoList()) .map(Collection::stream) .orElseGet(Stream::empty)) // pojoList为null时返回空流,不参与后续处理
内容的提问来源于stack exchange,提问作者CookieMonster
相关产品推荐
相关产品推荐

