我有以下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));
答案 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);
这显然是一种伪装,但其他解决方案也是如此。