【问题标题】:Java 8 Optional filter only if presentJava 8 可选过滤器仅在存在时
【发布时间】:2021-11-06 14:11:37
【问题描述】:

我有一个可为空的对象,如果该对象不是 null 并且不满足条件,我会尝试抛出异常。

我用Optional尝试这种方式:

Optional.ofNullable(nullableObject)
    .filter(object -> "A".equals(object.getStatus()))
    .orElseThrow(() -> new BusinessUncheckedException("exception message"));

当对象不是null 时,它会按我的意愿工作,否则,它也会抛出异常(我不希望这样)。

有一种方法可以使用Optional 或其他不使用if object != null 的方法吗?

【问题讨论】:

    标签: java java-8 optional


    【解决方案1】:

    假设您没有对返回的对象做任何事情,您可以使用 ifPresent 并传递 Consumer

    nullableObject.ifPresent(obj -> {
        if (!"A".equals(obj.getStatus())) {
            throw new BusinessUncheckedException("exception message");
        }
    });
    

    注意:正如@Pshemo在cmets中提到的,Consumer功能接口的契约只允许抛出RuntimeExceptions。

    否则,您最好使用您提到的 if 检查。

    IMO,在 Optional 上使用 filter 进行此类检查并不是那么可读/直观。我更喜欢,

    if (obj != null && !"A".equals(obj.getStatus())) {     
        throw new BusinessUncheckedException("exception message");
    }
    

    【讨论】:

      【解决方案2】:

      如果你map 为null,Optional 变为空:

      Optional.ofNullable(nullableObject)
          .map(object -> "A".equals(object.getStatus()) ? object : null)
          .ifPresent(object -> { throw new BusinessUncheckedException("exception message"); });
      

      【讨论】:

      • 我没有测试,但我认为当对象为空时它会抛出 NullPointerException。 (object.getStatus...)
      • @VictorSoares object 永远不会为空。
      • 好吧,你是对的。但无论如何它都会抛出 BusinessUncheckedException
      • 如果nullableObjectnull,OP 不想抛出异常。规则是,它可以是 null - 或者如果不是 null,那么它的 getStatus 必须是 A
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多