正确使用Optional.ifPresent()
我试图了解Java 8中API 的ifPresent()
方法Optional
。
我有简单的逻辑:
Optional<User> user=...user.ifPresent(doSomethingWithUser(user.get()));
但这会导致编译错误:
ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)
我当然可以做这样的事情:
if(user.isPresent()){
doSomethingWithUser(user.get());
}
但这就像混乱的null
支票一样。
如果我将代码更改为此:
user.ifPresent(new Consumer<User>() { @Override public void accept(User user) {
doSomethingWithUser(user.get());
}
});
代码变得越来越脏,这让我想到了回到旧null
支票。
有任何想法吗?
回答:
Optional<User>.ifPresent()
需要Consumer<? super
User>作为参数。您正在向其传递类型为void的表达式。因此,它不会编译。
使用者应被实现为lambda表达式:
Optional<User> user = ...user.ifPresent(theUser -> doSomethingWithUser(theUser));
甚至更简单,使用方法参考:
Optional<User> user = ...user.ifPresent(this::doSomethingWithUser);
这基本上与
Optional<User> user = ...user.ifPresent(new Consumer<User>() {
@Override
public void accept(User theUser) {
doSomethingWithUser(theUser);
}
});
想法是doSomethingWithUser()
仅当用户在场时才执行方法调用。您的代码直接执行方法调用,并尝试将其无效结果传递给ifPresent()
。
以上是 正确使用Optional.ifPresent() 的全部内容, 来源链接: utcz.com/qa/436504.html