Java Stream filter中迭代判断描述匹配rateAbbr列表任意元素的实现方法
Java Stream多关键词匹配修改方案
修改思路
原代码为单字符串匹配逻辑,当rateAbbr调整为List<String>类型后,只需将匹配逻辑替换为列表任意匹配即可,使用Stream的anyMatch方法实现,同时保留原有的大小写不敏感规则和空值防护逻辑。
直接修改版本(无需预处理)
如果rateAbbr列表规模较小,可直接在filter中做实时转换:
return Arrays.stream(partNumbers.get()) .filter(partNumber -> Objects.nonNull(partNumber.getDescription())) .filter(partNumber -> { String descriptionLower = partNumber.getDescription().toLowerCase(); return rateAbbr.stream() .filter(Objects::nonNull) // 过滤列表中的null元素,避免空指针异常 .map(String::toLowerCase) .anyMatch(descriptionLower::contains); }) .findFirst();
性能优化版本(推荐用于大列表场景)
如果rateAbbr列表元素较多,可提前对关键词做预处理,避免每次遍历partNumber时重复转换关键词大小写:
// 提前完成关键词的空值过滤和小写转换,仅执行一次 List<String> lowerCaseRateAbbrs = rateAbbr.stream() .filter(Objects::nonNull) .map(String::toLowerCase) .toList(); return Arrays.stream(partNumbers.get()) .filter(partNumber -> Objects.nonNull(partNumber.getDescription())) .filter(partNumber -> { String descLower = partNumber.getDescription().toLowerCase(); return lowerCaseRateAbbrs.stream().anyMatch(descLower::contains); }) .findFirst();
注:Java 16以下版本需将
.toList()替换为.collect(Collectors.toList()),同时需导入java.util.stream.Collectors包。
逻辑说明
- 保留了原有的描述字段非空校验逻辑,避免空指针
- 新增了
rateAbbr列表内部的null元素过滤,兼容列表存在空值的场景 - 所有字符串统一转小写后匹配,和原有逻辑保持大小写不敏感的匹配规则
anyMatch匹配到第一个符合条件的关键词就会终止判断,性能开销较低
内容的提问来源于stack exchange,提问作者Tiya
相关产品推荐
相关产品推荐

