【问题标题】:Why doesn't java OptionalInt have an or() method like Optional<T> does?为什么 java OptionalInt 没有像 Optional<T> 这样的 or() 方法?
【发布时间】:2021-08-03 18:39:17
【问题描述】:

Optional&lt;T&gt; 有一个 or() 方法,您可以将选项链接在一起

var o1  = Optional.<String>empty();

var o2 = Optional.of("some string");

Optional<String> o3 = o1.or(() -> o2); // o3 = o2

OptionalInt 没有这个功能。你会如何做与上面类似的事情?

不诉诸于

        var oi1 = OptionalInt.empty();
        var oi2 = OptionalInt.empty();

        OptionalInt oi3 = oi1.isPresent() ? oi1 : oi2;
                

【问题讨论】:

  • @Rogue 实际上 or() 是在 Java 9 中添加的。
  • 我的错,它是在 Java 9(不是 11)中添加的。也就是说,仍然可以通过#orElse 或#orElseGet 模拟使用,您只需要事先将#map 调用到Optional&lt;Optional&lt;T&gt;&gt;。总的来说,这实际上是为了什么用例?通常,简单地“操作”可选并使用某种形式的分支会更容易。
  • OptionalInt 也没有map()。
  • 如果你真的需要表示一个可为空的整数,为什么不直接使用Optional&lt;Integer&gt;?
  • @Rogue map 或 mapToObj,没关系。 OptionalInt 两者都没有。这是一个普遍的问题,从第一天开始,原始可选值就缺少Optional、map、flatMap、filter 的方法。新的or 方法并不特别……

标签: java optional


【解决方案1】:

正如 cmets 中所说,OptionalInt 类型不允许以任何其他方式执行此操作,而不是您自己建议的方式:

public OptionalInt orElse(OptionalInt o1, OptionalInt o2) {
  return o1.isPresent() ? o1 : o2;
}

如果需要,可以更改为使用Supplier

您最好首先使用Optional&lt;Integer&gt;。

至于为什么,几乎无法回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-04-09
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多