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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:06:07