Java 9 ifPresentOrElse 返回值

问题描述 投票:0回答:2

1/工作代码:

public Student process (int id, name){
  Optional<Student> studentOpt = myrepo.findById(id);
  studentOpt.isPresent() {
    return updateStudent(id, name);
  } else {
   return createStudent(id, name);
  }

2/我尝试将其更改为“完整的 lambda 代码”(不起作用):

public Student process (int id, name){
  Optional<Student> studentOpt = myrepo.findById(id);
  return studentOpt.ifPresentOrElse(student-> return updateStudent(id, name), () ->  return createStudent(id, name));
}

1/我应该将其更改为完整的 lambda 吗?什么是最干净的?

2/如果是,怎么办?

java lambda option-type java-9
2个回答
31
投票

鉴于您的方法

updateStudent
createStudent
涉及某种形式的副作用,并且您通常应该更喜欢无副作用的 lambda,我不建议您在这里使用它们。事实上,一个简单的 if-then-else 块就足够了。但是,如果您好奇,等效的 lambda 看起来像:

return studentOpt
    .map(unused -> updateStudent(id, name))
    .orElseGet(() -> createStudent(id, name));

0
投票

我们必须考虑到,在所有情况下,

.map().orElseGet()
并不等于
.ifPresentOrElse()
的返回值,因为如果第一个分支(例如:
updateStudent
)返回
null
,第二个分支(例如:
createStudent
)将返回被处决。

如果您 100% 确定第一个分支不会返回

null
,则两个表达式是等效的。

© www.soinside.com 2019 - 2024. All rights reserved.