如果不存在,如何将Optional映射到另一个Optional?

时间:2018-12-17 14:46:02

标签: java optional

我有以下Java 8代码:

public Optional<User> getUser(String id) {
    Optional<User> userFromCache = cache.getUser(id);
    if (userFromCache.isPresent()) {
        return userFromCache;
    }
    return repository.getUser(id);
}

它工作正常,但我想知道如何将调用链接为不使用if。我尝试使用orElseGet,但不允许返回另一个Optional<User>,而只能返回User

我想要这样的东西:

Optional<User> userFromCache = cache.getUser(id)
    .orElseGet(() -> repository.getUser(id));

3 个答案:

答案 0 :(得分:8)

自Java 9开始,就有Optional.or。它接受另一个Optional的供应商。

return cache.getUser(id).or(() -> repository.getUser(id));

答案 1 :(得分:5)

您可以根据其他可选内容的可为空值创建一个可选内容:

public Optional<User> getUser(String id) {
    return Optional.ofNullable(
        cache.getUser(id).orElseGet(
            () -> repository.getUser(id).orElse(null)
        )
    );
}

但是您当前的解决方案显然更具可读性。

答案 2 :(得分:2)

您仍然可以使用?:

return (userFromCache.isPresent()) ? userFromCache : repository.getUser(id);

这显然是一种伪装,但其他解决方案也是如此。