正确使用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

回到顶部