如何编写支持equalsIgnoreCase的Java Stream过滤Predicate?
实现方案
你可以通过编写带参数的Predicate工厂方法实现动态的忽略大小写匹配逻辑,同时复用你已经定义好的非空校验Predicate:
第一步:新增Predicate工厂方法
在你定义静态非空Predicate的同类下,新增两个工厂方法:
// 生成 SiteDuns 忽略大小写匹配的 Predicate public static Predicate<CharlieAddress> dunsEqualsIgnoreCase(String targetDuns) { return add -> CHARLIE_ADDRESS_DUNS_PRESENT.test(add) && add.getSiteDuns().equalsIgnoreCase(targetDuns); } // 生成 OrgName 忽略大小写匹配的 Predicate public static Predicate<CharlieAddress> orgNameEqualsIgnoreCase(String targetOrgName) { return add -> CHARLIE_ADDRESS_ORG_PRESENT.test(add) && add.getOrgName().equalsIgnoreCase(targetOrgName); }
第二步:改写业务过滤逻辑
利用Predicate自带的and组合方法,简化Stream的filter逻辑:
basicDetailEntity.forEach(prj -> { CharlieAddress billToAddress = addressList.stream() .filter(dunsEqualsIgnoreCase(prj.getBillToDuns()) .and(orgNameEqualsIgnoreCase(prj.getOperatingUnit()))) .findFirst().orElse(null); // 原有后续业务逻辑 });
可选健壮性优化
如果传入的匹配目标值可能为null,可以在工厂方法中增加前置判断,避免空指针:
public static Predicate<CharlieAddress> dunsEqualsIgnoreCase(String targetDuns) { // 目标值为空时直接返回永远不匹配的Predicate if (Objects.isNull(targetDuns)) { return add -> false; } return add -> CHARLIE_ADDRESS_DUNS_PRESENT.test(add) && add.getSiteDuns().equalsIgnoreCase(targetDuns); } // orgName的工厂方法可以按相同逻辑优化
内容的提问来源于stack exchange,提问作者sromit
相关产品推荐
相关产品推荐

