首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正确使用Optional.ifPresent()

正确使用Optional.ifPresent()
EN

Stack Overflow用户
提问于 2014-06-15 09:33:29
回答 5查看 330.9K关注 0票数 136

我试图理解Java8中的ifPresent() API的Optional方法。

我有一个简单的逻辑:

代码语言:javascript
运行
复制
Optional<User> user=...
user.ifPresent(doSomethingWithUser(user.get()));

但这会导致编译错误:

代码语言:javascript
运行
复制
ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)

我当然可以做这样的事:

代码语言:javascript
运行
复制
if(user.isPresent())
{
  doSomethingWithUser(user.get());
}

但这就像一张杂乱的null支票。

如果我将代码更改为:

代码语言:javascript
运行
复制
 user.ifPresent(new Consumer<User>() {
            @Override public void accept(User user) {
                doSomethingWithUser(user.get());
            }
        });

代码变得越来越脏,这让我想到回到旧的null检查。

有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-06-15 09:41:56

Optional<User>.ifPresent()以一个Consumer<? super User>作为参数。您传递给它的是一个类型为空的表达式。所以这不能编译。

“消费者”将作为lambda表达式实现:

代码语言:javascript
运行
复制
Optional<User> user = ...
user.ifPresent(theUser -> doSomethingWithUser(theUser));

甚至更简单,使用方法引用:

代码语言:javascript
运行
复制
Optional<User> user = ...
user.ifPresent(this::doSomethingWithUser);

这基本上和

代码语言:javascript
运行
复制
Optional<User> user = ...
user.ifPresent(new Consumer<User>() {
    @Override
    public void accept(User theUser) {
        doSomethingWithUser(theUser);
    }
});

其思想是,只有当用户在场时,doSomethingWithUser()方法调用才会被执行。您的代码直接执行方法调用,并尝试将其空结果传递给ifPresent()

票数 207
EN

Stack Overflow用户

发布于 2017-04-26 07:34:40

除了@JBNizet的答案之外,我对ifPresent的一般用例是将.isPresent().get()结合起来

旧方式:

代码语言:javascript
运行
复制
Optional opt = getIntOptional();
if(opt.isPresent()) {
    Integer value = opt.get();
    // do something with value
}

新途径:

代码语言:javascript
运行
复制
Optional opt = getIntOptional();
opt.ifPresent(value -> {
    // do something with value
})

对我来说,这更直观。

票数 40
EN

Stack Overflow用户

发布于 2018-12-13 11:27:37

既然你可以让代码变得简单,为什么要编写复杂的代码呢?

实际上,如果您绝对要使用Optional类,那么最简单的代码就是您已经编写的.

代码语言:javascript
运行
复制
if (user.isPresent())
{
    doSomethingWithUser(user.get());
}

这段代码的优点是

  1. 可读性
  2. 易于调试(断点)
  3. 不棘手

仅仅因为Oracle在Java8中添加了Optional类,并不意味着这个类必须在所有情况下都使用。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24228279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档