【问题标题】:How to avoid using Optional.get and Optional.isPresent如何避免使用 Optional.get 和 Optional.isPresent
【发布时间】:2017-08-29 09:07:27
【问题描述】:
public ValueA map(ValueB valueB, Date date) {
    Optional<ValueC> valueCOpt = find(valueB);
    if (valueCOpt.isPresent()) {
        ValueC valueC = valueCOpt.get();
        // call many getters on valueC and do a lot of logic with it.
        return map(/*some parameters*/);
    }
    return null;
}

这看起来很丑陋。选项的优势在这里完全消失了。我读到应该使用mapflatMap 而不是get。但是,如果我替换每个 getter 真的有好处吗

valueC.getFieldA()

valueCOpt.map(ValueC::getFieldA)

您知道这里的一些常见或最佳做法吗?

【问题讨论】:

标签: java java-8 refactoring optional


【解决方案1】:

你可以使用

public ValueA map(ValueB valueB, Date date) {
    return find(valueB)
        .map(valueC -> {
            // call many getters on valueC and do a lot of logic with it.
            return map(/*some parameters*/);
        })
        .orElse(null);
}

关键是映射函数只计算,如果可选不为空,否则,结果保持为空可选。如果可选项为空,orElse(null) 将返回 null

【讨论】:

  • 又一次...相当快。
  • 很好。进一步的重构将是不返回 null 而是一个空的可选项。然后我可以写: find(valueB).map(valueC ->{ // 在 valueC 上调用许多 getter 并用它做很多逻辑。return map(/*一些参数*/);});也就是说:不需要.orElse(null)
  • @Chris311 if map(/*some parameters*/);}) return a Optional 那么你可以使用 find(valueB).flatMap( valueC -&gt; map(...)) 代替;
  • @holi-java:这是一个人应该一直努力实现的目标吗?
  • 是的,如果允许更改 API,您可以省略 .orElse(null) 让方法返回 Optional&lt;ValueA&gt;,因为这需要调整所有调用者。如果你有这个选择,那就是正确的方向。
【解决方案2】:

您需要的是映射,然后是 orElse(),如果您需要异常,则为 orElseThrow()

ValueA valueA = valueCOpt.map(valueC -> mapToValue(valueC))
       .orElse(null);

orElse() 在需要默认值时使用,在本例中为 null

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 2012-08-28
    • 1970-01-01
    • 2011-11-02
    • 2017-07-09
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多