Java 8 仅在存在时可选过滤器

Java 8 Optional filter only if present

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

我尝试用这种方式 Optional:

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

当对象不是 null 时,它会按我想要的方式工作,但除此之外,它也会抛出异常(我不希望那样)。

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

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

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

注意:正如@Pshemo在评论中提到的,Consumer函数接口的契约只允许抛出RuntimeExceptions。

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

IMO,在 Optional 上使用 filter 进行此类检查并不是 readable/intuitive。我更喜欢,

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

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

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