我正在尝试理解ifPresent()
的方法Optional
Java 8 中的 API。
我有一个简单的逻辑:
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
check.
如果我把代码改成这样:
user.ifPresent(new Consumer<User>() {
@Override public void accept(User user) {
doSomethingWithUser(user.get());
}
});
代码变得越来越脏,这让我想到回到旧的null
check.
有任何想法吗?
Optional<User>.ifPresent()
需要一个Consumer<? super User>
作为论证。您向其传递一个类型为 void 的表达式。所以这不能编译。
Consumer 旨在作为 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()
仅当用户存在时才会执行方法调用。您的代码直接执行方法调用,并尝试将其 void 结果传递给ifPresent()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)