SpringBoot如何使用Stream流根据枚举类型判断并返回布尔值
实现代码
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Optional; public class YourService { private static final Logger log = LoggerFactory.getLogger(YourService.class); private DataService dataService; // 按你的项目方式注入dataService public Boolean isModelFastAndSuccess(String inputId){ // 1. 处理查询结果为空的边界场景 Optional<DataResponse> dataResponseOpt = dataService.getModelStatus(inputId); if (dataResponseOpt.isEmpty()) { log.error("未查询到ID为{}的相关模型数据", inputId); return false; } // 2. Stream流判断是否存在符合条件的实例 boolean hasValidModel = dataResponseOpt.stream() // 平铺获取所有Model实例,同时处理modelList为null的场景 .flatMap(dataResponse -> Optional.ofNullable(dataResponse.getModelList()).stream()) .flatMap(modelList -> modelList.stream()) // 匹配两个条件:类型为Fast、状态为CREATED .anyMatch(model -> ModelType.Fast == model.getType() && ModelStatus.CREATED == model.getStatus()); // 3. 匹配失败输出错误信息 if (!hasValidModel) { log.error("ID为{}的关联模型中不存在类型为Fast且状态为CREATED的实例", inputId); } return hasValidModel; } }
逻辑说明
- 优先处理查询结果为空的边界情况,直接返回false并输出错误
- 使用
flatMap把嵌套的集合结构平铺为Model类型的单一流,不需要写多层循环 - 用
anyMatch做存在性判断,该操作是短路操作,找到第一个符合条件的元素就会终止遍历,性能远优于先收集全量结果再判断 - 枚举比较用
==即可,枚举是单例模式,不需要用equals,如果你不确定枚举属性会不会为null,可以改成ModelType.Fast.equals(model.getType())避免空指针
原代码问题修正
- 修正了变量名不一致的问题:原代码定义的Optional变量是
modelList,后续错误使用了不存在的userProofList变量 - 去掉了不必要的
collect操作:存在性判断不需要收集全量结果,减少不必要的内存开销 - 补充了空指针防护逻辑:对可能为null的
modelList做了判空处理,避免运行时空指针异常
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

