Java 8 の「If/Throw、Else/Return」ロジックの省略形は? 質問する

Java 8 の「If/Throw、Else/Return」ロジックの省略形は? 質問する

Java 8 で if/throw else/return のより短い構文はありますか? では、java.util.Optionalこれを 1 つのステートメントで実現する手段が提供されていますが、Optionalnull 以外の参照を持つ呼び出しごとにインスタンスを作成する必要があります。

これを 1 つのステートメントで実現できますか?

public static MyEnum fromString(String value) {
    MyEnum result = enumMap.get(value);
    if (result == null)
        throw new IllegalArgumentException("Unsupported value: " + value);
    return result;
}

Optional の例 (悪い例、毎回 Optional インスタンスが必要)

public static MyEnum fromString(String value) {
    return Optional.ofNullable(enumMap.get(value)).orElseThrow(
        () -> new IllegalArgumentException("Unsupported value: " + value));
}

ベストアンサー1

一時インスタンスの影響Optionalはごくわずかです。通常、JVM は一時インスタンスであることを検出し、インスタンスを最適化します。一時インスタンスの作成が最適化されない場合でも、1 つの一時オブジェクトがメモリ管理に与える影響はごくわずかです。Java における Optional<T> の GC オーバーヘッド

ただし、マップが変更可能な場合は、次のトリックを使用できます。

public static MyEnum fromString(String value) {
    return enumMap.computeIfAbsent(value, v -> {
        throw new IllegalArgumentException("Unsupported value: " + v); });
}

は、このコードによって変更されませんが、不変マップでは、操作によって実際にマップが変更されるかどうかを確認せずにを使用しようとすると例外がMapスローされる可能性があるため、依然として変更可能である必要があることに注意してください。UnsupportedOperationcomputeIfAbsent


しかし、結局のところ、 には何も問題はありませんOptional。ただし、質問のコードは間違っていることに注意してください。 メソッドに渡すラムダ式はOptional.orElseThrow供給必要な例外をスローするのではなく、

public static MyEnum fromString(String value) {
    return Optional.ofNullable(enumMap.get(value)).orElseThrow(() ->
        new IllegalArgumentException("Unsupported value: " + value) // just return it
    );
}

おすすめ記事