[解決済み] 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()
.
関連
-
エラー java.util.NoSuchElementException
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
SpringBootApplication を型解決できない。
-
プロジェクトの依存関係を解決できなかった 解決
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
[解決済み] Androidでアプリケーションのメモリ使用量を確認するにはどうすればよいですか?
-
[解決済み] なぜJava 8のOptionalは引数で使ってはいけないのか
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】Java 8のOptional.ifPresentとif-not-Presentの機能的なスタイル?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
final, finally, finalizeの違いについて話してください。
-
SpringBootApplication を型解決できない。
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。