我正在尝试了解Java 8中ifPresent() API的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()

10-06 05:56