ray*_*man 78 java lambda optional java-8
我试图理解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支票.
有任何想法吗?
JB *_*zet 122
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().
cst*_*992 12
除了@ JBNizet的答案之外,我对ifPresent的一般用例是组合ifPresent和.isPresent():
旧方式:
Optional opt = getIntOptional();
if(opt.isPresent()) {
    Integer value = opt.get();
    // do something with value
}
新方法:
Optional opt = getIntOptional();
opt.ifPresent(value -> {
    // do something with value
})
对我来说,这更直观.
为什么要编写简单的复杂代码?
确实,如果您绝对要使用Optional该类,那么最简单的代码就是您已经编写的代码...
if (user.isPresent())
{
    doSomethingWithUser(user.get());
}
该代码的优点是
仅仅因为Oracle Optional在Java 8中添加了该类并不意味着该类必须在所有情况下都使用。
使用flatMap。如果存在值,则flatMap返回仅包含该值的顺序Stream,否则返回空Stream。所以没有必要使用ifPresent()。例:
list.stream().map(data -> data.getSomeValue).map(this::getOptinalValue).flatMap(Optional::stream).collect(Collectors.toList());
您可以使用如下方法引用:
user.ifPresent(ClassNameWhereMethodIs::doSomethingWithUser);
方法ifPresent()获取Consumer对象作为参数和(从 JavaDoc):“如果存在值,则使用该值调用指定的使用者。” 值是您的变量user。
或者,如果此方法doSomethingWithUser在User类中,而不是static,则可以使用如下方法引用:
user.ifPresent(this::doSomethingWithUser);
| 归档时间: | 
 | 
| 查看次数: | 138720 次 | 
| 最近记录: |