将用法转换为Optional.ifPresent
时,我遇到了一个问题。这是该代码的先前版本。
State state = State.OK;
final Optional<Person> checkExistingPerson = checkIt();
if(checkExistingPerson.isPresent()) {
Person person = checkExistingPerson.get();
if("blah".equals(person.getName())) {
state = State.DUPLICATE;
} else {
state = State.RESTORED;
}
return Member(person.getId(), state);
}
return Member(null, state);
这是
Optional.ifPresent
用法State state = State.OK;
final Optional<Person> checkExistingPerson = checkIt();
checkExistingPerson.ifPresent(person -> {
if("blah".equals(person.getName())) {
state = State.DUPLICATE;
} else {
state = State.NEW;
}
return Member(person.getId(), state);
});
return Member(null, state);
而且,这是IntelliJ迫使我进行更改的屏幕截图。
关于我的问题,使用
Optional
的最佳方法是什么?谢谢! 最佳答案
Lambda内部的外部变量必须为final
。ifPresent
接受Consumer
,因此它没有返回值,因此您不能使用return Member(person.getId(), state);
(还要记住,您在lambda中,因此return
不会从方法中退出,而是从lambda)。map
而是接受具有返回值的Function
,因此您可以使用它代替ifPresent
。
这是通过在lambda内移动state
并使用map
和orElseGet
来重构代码的方法:
return checkExistingPerson.map(person -> {
State state;
if("blah".equals(person.getName())) {
state = State.DUPLICATE;
} else {
state = State.NEW;
}
return Member(person.getId(), state);
})
.orElseGet(() -> Member(null, State.OK));
关于java - 如果将旧用法转换为Optional.ifPresent(),则出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52582806/