【发布时间】:2020-03-25 09:04:49
【问题描述】:
我需要一个关于“可选”的问题。
现在我的代码是这样的:
if(userInfoDto==null){
return ApiResult.successMsg("no param");
}
if(StringUtils.isEmpty(userInfoDto.getUserName())){
return ApiResult.successMsg("no username");
}
if(StringUtils.isEmpty(userInfoDto.getEmail())){
return ApiResult.successMsg("no email");
}
if(StringUtils.isEmpty(userInfoDto.getPhone())){
return ApiResult.successMsg("no phone");
}
我想使用“可选”来更改它并检查我的对象和我的属性是否为空。 但是,当我使用它时。我发现当我发现它们为空时我无法做某事。 例如:
Optional<UserInfoDto> optionalUserInfoVo = Optional.ofNullable(userInfoDto)
.orElseGet(#{default});
如果userInfoDto==null
我想返回一个ApiResult<T>给我的FE而不是默认值。
对于UserInfoDto,当我检查它的属性是否为空时,我需要返回一些提示。
但如果我使用if(){}else{}
我认为“可选”失去了它的功能;
我该怎么办?
【问题讨论】:
-
你是什么意思“失去它的功能”?
-
在同一个语句中,
Optional.ofNullable紧跟其后跟orElseGet没有多大意义。这似乎是不必要的复杂化。我不确定你想要达到什么目的。 -
Optional 旨在解决“null”使用的简单语法,如“Stream”。如果我创建一个 Optional ,然后我使用“if”来检查“isPresent()”。我认为,也许,我可以直接使用“if(xxx==null)”
-
Optional是为了解决有意的null返回值(表示不存在的值)和应该是非null的返回值(但可能错误地是null)。无意让开发人员盲目地将任何处理null的代码替换为Optional用法。 -
@Naman 不,你有两个问题。即使不使用
Map.of(..),代码也不会正式正确(尽管可能使用顺序流)。使用Stream.of(Object::isNull, x -> x.someCondition()) .filter(p -> p.test(null)) .findFirst();时,正确答案是第一个谓词根据遇到顺序,但构造依赖于处理顺序,因为第二个谓词在没有时中断由于已经评估的第一个谓词而被跳过。在实践中,这可能会与并行流中断,这可能会同时评估两个谓词。