【问题标题】:Java 8 Optional: choose between two possibly null valuesJava 8 可选:在两个可能为空的值之间进行选择
【发布时间】:2018-10-11 09:39:01
【问题描述】:

我必须在两个字符串变量之间进行选择——第一个没有null 值。 如果它们都是null - 那么我想退出该方法。 这可以在以下代码中完成:

String value1 = <get from somewhere>
String value2 = <get from somewhere else>
String target = null;
if (value1 != null) target = value1;
else if (value2 != null) target = value2;
if (target == null) return null;

也可以简写:

String target = value1 != null ? value1 : value2 != null ? value2 : null;
if (target == null) return null;

我正在努力使用Optional以流利的形式做到这一点
注意:我只能使用 Java 8 语法(所以没有Optional.or()

【问题讨论】:

  • 您使用三元运算符的版本与使用if 块的版本不同。在第一个版本中,value2 似乎优先于 value1 当两者都不为空时。
  • 在重复链接中搜索Optional,得到30+票的答案。
  • @ernest_k。你是对的,更正
  • Stream.of(first, second).filter(Objects::nonNull).findFirst() 我猜...
  • @Eugene 如果你这么认为,你绝对应该投票重新开放,而且你不需要征求我的同意:-)

标签: java java-8 optional


【解决方案1】:
String target = Optional.ofNullable(value1).orElse(value2)

如果value1 == null,则返回value2 - 它要么有值,要么为空。无需通过将value2 == null 映射为null 来显式处理它。

【讨论】:

    【解决方案2】:

    如果你只有两个选择,你可以这样做:

    target = Optional.ofNullable(value1)
                .orElseGet(() -> Optional.ofNullable(value2).orElse(null));
    

    即使这可以用于两个以上的变量。

    使用 java-9,这可以使其更具可读性:

    target = Optional.ofNullable(value1)
                .or(() -> Optional.ofNullable(value2))
                .orElse(null);
    

    确实,另一个答案有一个很好的观点;因此这可以进一步简化为根本不使用Optionals,仍然是一行:

     target = value1 != null ? value1 : value2;
    

    【讨论】:

    • 我认为这比另一个问题的Stream.of 答案更清楚。
    • @SharonBenAsher 不是真的......特别是如果你有三个变量,这会很快变得丑陋。但我猜这是一种选择
    • 是的。很明显有两个选项。也许,为了完整起见,您可以提到 Java 9 使用 Optional.or 解决了这个问题
    • 加上此处发布的答案未发布在其他问题中
    • @Michael 当我有更多时间并以全新的心态重新阅读它们时,我必须重新阅读它们,但这个地方不是我们应该始终同意的地方 - 你认为是重复的,请关闭它(再次),不合时宜地也会被删除,我没有任何冒犯。实际上谢谢你的cmets
    【解决方案3】:

    如果你想检查 AND 条件

    Optional.ofNullable(value)
                        .filter( res -> StringUtils.isNotEmpty((CharSequence) val.get()))
                        .ifPresent( finalResul -> {
                            //apply logic
                        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      相关资源
      最近更新 更多