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

Spring Boot中如何按条件过滤返回列表并避免空指针异常

问题核心原因

原代码存在两处严重错误:

  • 空值校验完全缺失:product对象、product.name、datas字段任意为null时都会触发空指针异常,也就是你遇到的Cannot invoke "String.equals(Object)" because "datas" is null报错
  • 循环逻辑完全错误:循环内调用addAll(itemCollection)会重复添加整个列表的元素,且循环过程中调用remove(i)会导致索引偏移,漏掉后续元素的判断
修改后的实现代码

提供两种写法,你可以根据项目Java版本选择:

方案1:常规循环写法(兼容Java 7及更早版本)

@Override
public List<Item> getcollectionfromapi(List<String> itemids) throws Exception {
    List<Item> itemCollection = itemRepository.findById(itemids);
    List<Item> resultList = new ArrayList<>();
    for (Item item : itemCollection) {
        // 逐层校验空值,避免空指针
        if (item.getProduct() == null) {
            continue;
        }
        String name = item.getProduct().getName();
        String datas = item.getData();
        // 两个条件同时满足才加入结果集:name非空、datas不区分大小写等于data
        if (name != null && name.length() > 0 && "data".equalsIgnoreCase(datas)) {
            resultList.add(item);
        }
    }
    return resultList;
}

方案2:Stream流式写法(Java 8+推荐,代码更简洁)

@Override
public List<Item> getcollectionfromapi(List<String> itemids) throws Exception {
    return itemRepository.findById(itemids)
            .stream()
            // 过滤product不为null的对象
            .filter(item -> item.getProduct() != null)
            // 过滤product.name非空的对象
            .filter(item -> item.getProduct().getName() != null && item.getProduct().getName().length() > 0)
            // 过滤datas不区分大小写等于data的对象,常量在前避免空指针
            .filter(item -> "data".equalsIgnoreCase(item.getData()))
            // Java 16+直接用toList(),Java 8-15版本替换为.collect(Collectors.toList())即可
            .toList();
}
关键修改点说明
  • 所有可能为null的字段都提前做了非空判断,避免空指针异常
  • 用"data".equalsIgnoreCase(datas)替代datas.equals("Data"):常量在前调用方法,就算datas为null也只会返回false,不会抛出空指针
  • 去掉了原逻辑中错误的addAll和remove操作,仅将符合条件的单个元素加入结果集,不会出现重复添加、漏判的问题

内容的提问来源于stack exchange,提问作者welcome_java

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:15:03