Stream filter如何通过Lambda仅在result.getExtendedAddress()存在时新增条件
Java Stream Lambda 过滤条件简化方案
最简实现(基于Apache Commons Lang StringUtils null安全特性)
Apache Commons Lang包下的StringUtils.containsIgnoreCase本身是null安全的:如果待匹配的字符串为null,会直接返回false,完全不需要手动加result.getExtendedAddress() != null的空判断,和你原有逻辑完全等价,代码量直接缩减一半:
.filter(result -> StringUtils.isNotBlank(title) && (StringUtils.containsIgnoreCase(result.getTitle(), title) || StringUtils.containsIgnoreCase(result.getExtendedAddress(), title)))
同时这个写法还规避了手动调用toLowerCase()可能带来的区域语言大小写转换异常问题,比如土耳其语字符i的大小写转换不符合预期的边界情况。
可维护性优化方案(适合后续扩展过滤规则)
如果后续还有新增其他字段匹配的需求,可以把匹配逻辑单独抽成私有方法,Lambda处直接调用即可,可读性更高:
// 按实际业务调整方法作用域和入参 private boolean matchSearchRule(Result result, String searchTitle) { if (StringUtils.isBlank(searchTitle)) { return false; } // 优先匹配标题 if (StringUtils.containsIgnoreCase(result.getTitle(), searchTitle)) { return true; } // 扩展地址存在时匹配地址,也可以在此处新增其他字段的匹配逻辑 return StringUtils.containsIgnoreCase(result.getExtendedAddress(), searchTitle); }
Filter处直接调用即可:
.filter(result -> matchSearchRule(result, title))
内容的提问来源于stack exchange,提问作者Anuska
相关产品推荐
相关产品推荐

