使用Java8 Optional <T>重构旧代码

斋戒

考虑一下我有一个简单的模型UserInfo和Passport:

public class UserInfo {
    private int age;
    private String passportId;
    // getters, setters
}

public class Passport {
    // empty
}

如果用户年龄大于20岁,我想查看他的护照,在Java7中,我可以这样做:

    UserInfo userInfo = new UserInfo();
    userInfo.setAge(22);
    userInfo.setPassportId(null);

    final Passport passport;
    if (userInfo.getAge() > 20) {
        if (userInfo.getPassportId() == null) {
            throw new IllegalArgumentException("Set passport");
        }
        else {
            passport = findPassportById(userInfo.getPassportId());
        }
    }

这很简单,但是我想使用Java8 Optional <T>

如果只需要执行一个可为null的操作,则可选似乎非常方便:

  1. 如果使用.orElseThrow()为null,则抛出异常
  2. 使用.ifPresent()在值存在的情况下进行一些计算(在我的情况下为findPassportById

但是当我尝试同时做这两种事情时,我会发现一些丑陋的东西:

    String passportId = Optional.of(userInfo)
            .filter(x -> x.getAge() > 20)
            .map(UserInfo::getPassportId)
            .orElseThrow(() -> new IllegalArgumentException("Set passport"));

    final Passport passport;
    // null checks again? I don't want to!
    if (passportId != null) {
        passport = findPassportById(passportId);
    }

因此,有没有实践可以更干净地重构这种常见情况?

谢谢!

一个更好的奥利弗

我认为那UserInfo不是null,所以将其包装为Optional没有意义。您也不想在年龄低于20岁时继续。

还有一点要记住的是,要点Optional避免异常。如果passportId是必不可少的财产,那么无论如何它都应该是强制性的(如果年龄> 20岁)。否则,您将首先处理损坏的数据。另一方面,如果不是强制性的,则抛出异常没有多大意义。

如果你不想让它强制性我建议作出OptionalpassportId通过,可能直接UserInfo本身。如果仍然需要常规的吸气剂,则可以使用属性的名称添加一个新方法(即使在JDK中,这也是常见的做法)。

public class UserInfo {

  public String getPassportId() {...}

  public Optional<String> passportId() {
    return Optional.ofNullable(passportid);
  }

  ...

if (userInfo.getAge() > 20) {
  userInfo.passportId().ifPresent(...)
} 

但是,如果您坚持要引发异常,则可以采用以下方式:

if (userInfo.getAge() > 20) {
  Passport passport = userInfo.passportId()
                       .map(this::findPassport)
                       .orElseThrow(() -> new IllegalArgumentException("Set passport"));
  ...                            
} 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章