場合、問題は古い学校を変換中Optional.ifPresentへの使用()

vtokmak:

利用状況にあれば古い学校を変換しながら、私は問題に直面しています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私の問題にについては?THXすべて!

しっかりと激しく非難
  1. ラムダの内部外部変数はする必要がありますfinal
  2. ifPresent受け入れConsumer、それは戻り値はありませんので、したがって、あなたが使用することはできませんreturn Member(person.getId(), state);(また、あなたがラムダの内側にあることを覚えているのでreturn、あなたの方法から出口へ行くが、ラムダからされていません)。

map代わりに受け入れFunction、戻り値を持っているので、あなたがするのではなく、それを使用することができますifPresent

これは、あなたが移動することで、あなたのコードをリファクタリングできる方法である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));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222849&siteId=1