【问题标题】:Clean way to use optionals on optionals - Java?在选项上使用选项的干净方法 - Java?
【发布时间】:2017-03-22 17:14:38
【问题描述】:

我需要根据另一个可选值获取一个可选值。这是我的意思的一个过于简化的例子:

Optional<SomeA> someA = callSomeFunctionThatReturnsOptionalSomeA(....);
Optional<SomeB> someB = // if someA is present, call some method to get value of someB, if someA is not present, don't bother and just return an empty optional. 

我知道我可以使用 else/if for someA.isPresent() 来做到这一点,但如果可能的话,我想尝试使用更短的方式来做到这一点(使用可选的 map?)。有小费吗?

【问题讨论】:

  • 三元组。或者,条件运算符? :

标签: java optional


【解决方案1】:
Optional someA = callSomeFunctionThatReturnsOptionalSomeA(....); 
Optional someB = someA.map(n -> transformFirstResult(n));

就这么简单。

如果someA 有值,someB 将包含transformFirstResult() 的返回值,否则为空。 (如果transformFirstResult() 本身返回一个可选项,则需要使用flatMap() 而不是map() 以避免以可选项结尾。)

正是这些方法(map()orElse()orElseGet()orElseThrow()filter())使 Optional 真正有用。如果你只使用isPresent()get(),在实践中你并没有真正赢得太多(尽管它使方法的契约更加明确,这是一件好事)。

【讨论】:

  • 我不同意你最后的说法。使用Optional,无论您如何使用它,都明确表明您的意图。它就在您方法的签名中。使用null 作为标记值可以完成同样的事情,但是是隐式的。除了查看实现或阅读文档之外,您永远不会知道是否期望它。
  • @Michael 虽然这是一个非常微不足道的优势。
  • 我完全不同意。 Null is evil
  • @Michael 很公平,这就是你的意见。例如,我的观点是,如果你打电话给ifPresent()get(),你就已经犯了一个错误。无论如何,我的声明是,正是这些方法使Optional 有用和优雅,没有它们,它只是一个将问题推得更远的结构。
  • @Michael 顺便说一下,我不同意你对null 的看法,我只是说将Optional 类压缩到Java 中(而不是将其作为一部分)类型系统,就像你在函数式语言中所做的那样)本身并不是一个巨大的胜利。但是让它做一些事情,这样你就不必解开它们的价值,现在我们正在用煤气做饭。 (我已经改写了我的答案以反映这一点,因此感谢您的 cmets。)
【解决方案2】:

怎么样:

return getA(...).isPresent() ? getB(...) : Optional.empty();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多