概要
Optional
インスタンスが値を保持している場合にその値を返し、値が存在しない場合には任意の検査例外をスローする。
orElseThrow()
メソッドは、値が存在しない場合に例外をスローするために、Supplierインターフェースを使用する。
例
Optional<String> optional = Optional.empty();
String value = optional.orElseThrow(() -> new NoSuchElementException("Value is not present"));
上記の例では、optional
は空のOptional
インスタンスである。orElseThrow()
メソッドには例外を生成するための関数(ここではラムダ式)が渡されている。指定された例外(NoSuchElementException
)がスローされる。
orElseThrow()
メソッドは、値が存在しない場合に任意の検査例外をスローする際に便利である。
例えば、より具体的な例として、以下のようなユーザーが商品の詳細情報を取得する場合を考えてみる。
例
import java.util.Optional;
public class ProductDetails {
private String name;
private double price;
public ProductDetails(String name, double price) {
this.name = name;
this.price = price;
}
public static void main(String[] args) {
Optional<ProductDetails> productDetails = getProductDetails(1234);
ProductDetails details = productDetails.orElseThrow(() -> new RuntimeException("商品の詳細情報が見つかりませんでした。"));
System.out.println("商品名: " + details.getName());
System.out.println("価格: " + details.getPrice());
}
public static Optional<ProductDetails> getProductDetails(int productId) {
// データベースや外部システムから商品の詳細情報を取得する処理を想定
// ここではサンプルデータを使用しています
if (productId == 1234) {
return Optional.of(new ProductDetails("商品A", 1000.0));
}
return Optional.empty();
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
この例では、getProductDetails()
メソッドで指定した商品IDに基づいて商品の詳細情報を取得している。取得された情報はOptional<ProductDetails>
として返される。
orElseThrow()
メソッドを使って、詳細情報が取得できなかった場合には、RuntimeException
という例外をスローしている。
また、カスタムの例外クラスやメッセージを指定することも可能である。
orElseThrow()
メソッドは値が存在しない場合にのみ例外をスローするため、事前にisPresent()
メソッドを使用して値の存在をチェックする必要はない。
ただし、必ず値が存在するとわかっている場合にのみ使用するようにすることが必要である。