1. ホーム
  2. java

[解決済み] Optional.ifPresent()の正しい使い方

2022-03-15 06:28:51

質問

を理解しようとしています。 ifPresent() メソッドの Optional Java 8のAPIです。

簡単なロジックがあります。

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 をチェックします。

何か思い当たることはありますか?

解決方法は?

Optional<User>.ifPresent() を取る。 Consumer<? super User> を引数として与えます。型がvoidの式を渡していますね。だから、これはコンパイルできない。

Consumerはラムダ式で実装されることを想定しています。

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() .