【问题标题】:Conditional extract of value from Java Optional有条件地从 Java 中提取值 可选
【发布时间】:2018-05-03 19:35:14
【问题描述】:

我试图找到使用 Java Optional 的最简洁(和有意义)的方法,从 Optional<String> 中读取第一个值并返回字符串(如果存在),或者返回“NOT_FOUND”。这是我正在使用的代码:

public static String getValue(Optional<String> input) {
    return input.ifPresent(val -> val.get()).orElse("NOT_FOUND")
}

Optional 的方法显然有非常特定的用途,但 API 让我感到困惑。

更新(2018 年 4 月 13 日): 我的问题中的代码不正确,因为如果我将val 视为Optional 中的值,那么val.get() 没有任何意义。感谢您指出这一点,@rgettman。

此外,我在已接受答案的 cmets 中为我的问题添加了另一部分,即我需要一种方法来在返回之前操纵字符串值(如果存在)。如果 Optional 不包含值,orElse("NOT_FOUND") 仍然适用。那么什么是可接受的使用Optional API 来实现以下目标?

public static String getValue(Optional<String> input) {
    return input.isPresent() ? input.get().substring(0,7).toUpperCase() : "NOT_FOUND";
}

@Aominè 的回答和后续 cmets 解决了这个问题的两个部分。

【问题讨论】:

  • 什么是val?您是否尝试以某种方式使用val.get() 的返回值?
  • 其实val是Optional中的值,所以val.get()甚至不会编译。我正在尝试获取 Optional 中的值并在存在值时从方法中返回它。
  • @WebUser inputOptional&lt;String&gt;valString。看到这个Guide To Java 8 Optional,然后看到ifPresent返回类型的java文档。
  • @Aominè 指出,感谢您提供的额外链接。

标签: java optional


【解决方案1】:

您所要做的就是将您的退货声明更改为:

return input.orElse("NOT_FOUND");

这将返回 Optional 中的对象,如果存在则返回“NOT_FOUND”。

也就是说,我会避免使用 Optional 作为参数。见here

【讨论】:

  • 令人惊讶的是它的可读性!但是如果我想在返回之前操纵input 中的值呢?相当于return input.isPresent() ? input.get().substring(0,7).toUpperCase() : "NOT_FOUND"; 我试过return input.map(val -&gt; val.substring(0,7).toUpperCase()).orElse("NOT_FOUND");,它似乎工作。这是适当地使用 API 来实现我所追求的结果,还是我可以做得更好?
  • @WebUser 后者更好,因为它更具可读性(IMO),是的,这是适当使用 API 来实现您所追求的结果。
  • 感谢您的确认!
【解决方案2】:

如果需要对字符串值进行操作,如果在返回之前已经存在,使用mapmethod

public static String getValue(Optional<String> input) {
    return input.map(s -> s.substring(0,7).toUpperCase()).orElse("NOT_FOUND");
} 

如果input 为空,则该方法返回默认值-"NOT_FOUND",否则返回字符串的大写部分。

getValue(Optional.ofNullable(null));
$6 ==> "NOT_FOUND"

getValue(Optional.of("some long string"));
$7 ==> "SOME LO"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多