将用法转换为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迫使我进行更改的屏幕截图。
java - 如果将旧用法转换为Optional.ifPresent(),则出现问题-LMLPHP

关于我的问题,使用Optional的最佳方法是什么?谢谢!

最佳答案

Lambda内部的外部变量必须为final
ifPresent接受Consumer,因此它没有返回值,因此您不能使用return Member(person.getId(), state);(还要记住,您在lambda中,因此return不会从方法中退出,而是从lambda)。


map而是接受具有返回值的Function,因此您可以使用它代替ifPresent

这是通过在lambda内移动state并使用maporElseGet来重构代码的方法:

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/

10-09 05:52