Java 8 の Optional.ifPresent と if-not-Present の関数型スタイルは? 質問する

Java 8 の Optional.ifPresent と if-not-Present の関数型スタイルは? 質問する

OptionalJava 8 では、オブジェクトが存在する場合はオブジェクトに対して何かを実行し、存在しない場合は別の処理を実行したいと考えています。

if (opt.isPresent()) {
  System.out.println("found");
} else {
  System.out.println("Not found");
}

ただし、これは「機能的なスタイル」ではありません。

OptionalメソッドがありますifPresent()が、メソッドを連鎖できませんorElse()

したがって、次のように書くことはできません。

opt.ifPresent( x -> System.out.println("found " + x))
   .orElse( System.out.println("NOT FOUND"));

Optional.map()@assylias への返信ですが、次の場合には機能しないと思います。

opt.map( o -> {
  System.out.println("while opt is present...");
  o.setProperty(xxx);
  dao.update(o);
  return null;
}).orElseGet( () -> {
  System.out.println("create new obj");
  dao.save(new obj);
  return null;
});

この場合、optが存在する場合は、そのプロパティを更新してデータベースに保存します。 が利用できない場合は、新しい を作成してobjデータベースに保存します。

2 つのラムダで を返す必要があることに注意してくださいnull

しかし、optが存在する場合、両方のラムダが実行されます。objが更新され、新しいオブジェクトがデータベースに保存されます。 これは、return null最初のラムダの のためです。 そしてorElseGet()は実行を続けます。

ベストアンサー1

Java 9以降を使用している場合は、ifPresentOrElse()方法:

opt.ifPresentOrElse(
   value -> System.out.println("Found: " + value),
   () -> System.out.println("Not found")
);

おすすめ記事