【问题标题】:java8-"Optional" check and return [closed]java8-“可选”检查并返回[关闭]
【发布时间】: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&lt;T&gt;给我的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 -&gt; x.someCondition()) .filter(p -&gt; p.test(null)) .findFirst();时,正确答案是第一个谓词根据遇到顺序,但构造依赖于处理顺序,因为第二个谓词在没有时中断由于已经评估的第一个谓词而被跳过。在实践中,这可能会与并行流中断,这可能会同时评估两个谓词。

标签: java java-8 optional


【解决方案1】:

这完全没有意义。 Optional 用于可能不存在且几乎没有其他好的用途的返回值。您的用例不是其中之一。只是为了说明和警告,您可能会获得类似于您正在尝试使用以下构造的内容:

    String message = Optional.ofNullable(userInfoDto)
            .flatMap(dto -> Optional.ofNullable(dto.getUserName())
                    .flatMap(un -> Optional.ofNullable(dto.getEmail())
                            .map(em -> {
                                // Do your processing here
                                return "Successfully processed";
                            })))
            .orElse("Something’s wrong here");
    return ApiResult.successMsg(message);

但是:

  1. 它的可读性明显低于您在问题中的代码。
  2. 它不能针对不同的空条件给出不同的错误消息,如果某处有空值,它只会给出一个非常无用的消息。

我什至稍微简化了要求。我正在检查空用户名和电子邮件。如果您在同一行添加空电话号码检查,则会进一步降低可读性。

孩子们,不要在家里尝试这个。 :-)

【讨论】:

  • 好的,现在我明白了!感谢您的回答!在我的项目中,我很少有场景使用“可选”来解决“检查空白”的问题。很多{if else}让我觉得丑陋和相似。但我应该换一种方法来解决它!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-08-13
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多