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
相关产品推荐
相关产品推荐

