You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 00:36:03