Java 8中"If/Throw,Else/Return"逻辑的简写?

Sam*_*rry 27 java java-8

在Java 8中if/throw else/return是否有更短的语法?java.util.Optional提供了在一个语句中完成此操作的方法,但它需要Optional为每个具有非空引用的调用创建一个实例.

这可以在一个声明中完成吗?

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

可选示例(错误,每次都需要可选实例)

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

Hol*_*ger 30

临时Optional实例的影响可以忽略不计.通常,JVM将检测其临时性质并优化实例.即使临时实例创建没有被优化掉,一个临时对象对内存管理的影响也是非常低的.

但是,如果地图是可变的,您可以使用以下技巧:

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

请注意,Map此代码不会修改它,但仍然必须是可变的,因为不可变映射可能会UnsupportedOperation为尝试使用computeIfAbsent而抛出异常,而不会检查操作是否真的会修改映射.


但最终,没有任何问题Optional.但请注意,您的问题中的代码是错误的.传递给方法的lambda表达式Optional.orElseThrow旨在提供所需的异常,而不是抛出它:

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

  • 我同意,在更高级别的接口中提供将回退操作作为参数的方法可能是一个很好的实践。在最好的情况下,您可以将供应商/函数传递给较低级别​​的方法,例如后端映射的“computeIfAbsent”或可选的“orElseThrow”。当方法可能失败时,向调用者返回“Optional”也是一个不错的选择。 (2认同)