You need to enable JavaScript to run this app. Java Stream调用前List非空校验的无IF实现方法
优惠活动
大模型
产品
解决方案
定价
更多

Java Stream调用前List非空校验的无IF实现方法

无冗余if分支的Stream空集合兜底实现

不需要编写额外的非空判断分支,直接通过流操作本身的空值兜底能力,将可能返回null的item.getSubCategory()调用点转换为安全的空流,从根源上避免触发NPE。

具体实现方案

1. 原生JDK无依赖实现

JDK9+ 写法

借助Stream.ofNullable包裹可能为null的集合,结合flatMap展开为标准集合流:

List<SubCategoryViewModel> subCategoriesList = Stream.ofNullable(item.getSubCategory())
        .flatMap(Collection::stream)
        .map(category -> new SubCategoryViewModel(
                category.get(String.format("_%s", categoryProperties[0])).toString(),
                category.get(categoryProperties[2]).toString(),
                category.get(categoryProperties[3]).toString()
        ))
        .collect(Collectors.toList());

执行逻辑:如果item.getSubCategory()返回null,Stream.ofNullable会直接返回空流,后续流操作全部跳过;如果返回有效集合,就正常执行转换逻辑。

JDK8 兼容写法

如果项目基于JDK8开发,没有Stream.ofNullable能力,可以借助Optional实现完全一致的兜底效果:

List<SubCategoryViewModel> subCategoriesList = Optional.ofNullable(item.getSubCategory())
        .stream()
        .flatMap(Collection::stream)
        .map(category -> new SubCategoryViewModel(
                category.get(String.format("_%s", categoryProperties[0])).toString(),
                category.get(categoryProperties[2]).toString(),
                category.get(categoryProperties[3]).toString()
        ))
        .collect(Collectors.toList());

2. 通用工具库简化写法

如果项目已经引入了通用工具组件,可以进一步压缩代码:

  • 使用Apache Commons 的CollectionUtils.emptyIfNull():将可能为null的集合兜底为常量空集合,直接调用流即可,写法为CollectionUtils.emptyIfNull(item.getSubCategory()).stream()
  • 使用Guava 的集合工具:通过Optional.ofNullable(item.getSubCategory()).orElseGet(ImmutableList::of).stream()实现空值兜底

原代码规范优化提示

原代码在map操作块内直接调用subCategoriesList.add()做外部集合修改,不符合Stream的API设计规范:map操作的定位是流元素的类型转换,不应混入外部状态修改的副作用,并行流场景下容易引发不可预期的并发问题。

  • 如果是需要生成全新的目标集合,直接将map后的元素通过Collectors.toList()收集即可,不需要提前操作外部集合
  • 如果是需要将转换后的元素合并到已有的subCategoriesList中,应将add操作放到流的终端操作forEach中:
Stream.ofNullable(item.getSubCategory())
        .flatMap(Collection::stream)
        .map(category -> new SubCategoryViewModel(
                category.get(String.format("_%s", categoryProperties[0])).toString(),
                category.get(categoryProperties[2]).toString(),
                category.get(categoryProperties[3]).toString()
        ))
        .forEach(subCategoriesList::add);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 08:00:14