代码之家  ›  专栏  ›  技术社区  ›  springenthusiast

用Java 8替换空校验

  •  5
  • springenthusiast  · 技术社区  · 7 年前

    我正在尝试用可选的代码块替换下面的代码块,只是想检查一下这样做是否会有任何不好的影响,比如性能或者其他什么?

    现有代码:

    UserObj userObj=new UserObj();
    Object result = fetchDetails();
    if (null != result) {
        userObj.setResult(result.toString());
    }
    

    用Java 8 Optional :

    UserObj userObj=new UserObj();
    Optional.ofNullable(fetchDetails()).ifPresent(var -> userObj.setResult(var.toString()));
    

    这样做只是为了使代码看起来简洁,因为我的代码中有很多空检查块。

    2 回复  |  直到 7 年前
        1
  •  6
  •   ETO    7 年前

    首先,我认为你误解了 Optional . 它不仅仅是为了更换

    if(obj != null){ ... }
    

    可选的 是为返回值的函数提供一种方法,以指示没有返回值。请阅读 this post 了解更多详细信息。

    正确使用 可选的 在你的情况下,可以选择返回 ResultObj fetchDetails 方法:

    Optional<ResultObj> fetchDetails() {
       ...
    }
    

    然后你只需将方法链接到获取的 可选的 就像你以前那样。

    更新

    如果您不能修改 获取细节 仍然可以选择将其包装成您自己的方法,如下所示:

    Optional<ResultObj> fetchOptionalDetails() {
        return Optional.ofNullable(fetchDefails());
    }
    

    创建一个新方法会增加一点点开销,但是代码的可读性会更高:

    fetchOptionalDetails().ifPresent(details -> /* do something */);
    
        2
  •  0
  •   Buddy    7 年前

    返回 Optional fetchDetails() 这里更有意义。那么你可以直接查一下 ifPresent 然后继续