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

标签 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;
}

可选示例(不好,每次都需要可选实例)

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

最佳答案

临时 Optional 实例的影响可以忽略不计。通常 JVM 会检测到它的临时性质并优化掉实例。即使临时实例的创建没有被优化掉,一个临时对象对内存管理的影响也低得离谱。另见 GC overhead of Optional<T> in Java .

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

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

请注意,Map 未被此代码修改,但仍必须是可变的,因为不可变映射可能会抛出 UnsupportedOperation 异常以尝试使用 computeIfAbsent 无需检查该操作是否真的会修改 map 。


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

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

关于java - Java 8 中 "If/Throw, Else/Return"逻辑的简写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26499904/

相关文章:

java - 如何使用 Java 8 streaming api 从 map 列表创建 map map

java - 将数据保存在 XML 文件中

java - 如何在Spring MVC中启用基于http请求头的json动态 pretty-print ?

java - TreeSet 中的排名元素

java - 为什么实例方法引用适用于不匹配的签名?

java - 将 List 转换为 Map 并过滤空键

java - 带有外部 jar 'Not a Managed Type' 的 Spring Boot

java - Hibernate:首次启动程序期间出现未知实体异常

java - Spring 4.1.9 不适用于 Java 8

javascript - 多线程 Nashorn : o. constructor === o.constructor gives false