【问题标题】:How to map an OptionalLong to an Optional<Long>?如何将 OptionalLong 映射到 Optional<Long>?
【发布时间】:2018-08-13 13:11:09
【问题描述】:

我有一个OptionalLong 的实例。但我的一个库需要Optional&lt;Long&gt; 作为参数。

如何将我的OptionalLong 转换为Optional&lt;Long&gt;

我梦想着这样的事情:

OptionalLong secondScreenHeight = OptionalLong.of(32l); // or: OptionalLong.empty()
api.setHeight(secondScreenHeight.mapToRegularOptional()); // .mapToUsualOptional does not exist

【问题讨论】:

  • 问题是为什么OptionalLong没有map/filter
  • api.setHeight(…) 不应期望 Optional&lt;Long&gt; 作为参数类型。那你就不会有这样的问题了。
  • 根本不要使用Optional作为参数,无论是否通用。读起来很可怕。使用空的可选参数调用 setHeight 是什么意思?没做什么?然后,根本不要调用它。 secondScreenHeight.ifPresent(api::setHeight) 更有意义。
  • 补充 Holger 已经指出的内容,这也是 IntelliJ 建议您的... ...Optional 旨在为库方法返回类型提供有限的机制需要一种明确的方式来表示“没有结果”。如果类需要可序列化,则使用 java.util.Optional 类型的字段也会有问题,which java.util.Optional is not.
  • 为什么要在这里开启赏金?这个问题得到了很好的回答

标签: java java-8 optional


【解决方案1】:

你可以这样做:

final OptionalLong optionalLong = OptionalLong.of(5);

final Optional<Long> optional = Optional.of(optionalLong)
            .filter(OptionalLong::isPresent)
            .map(OptionalLong::getAsLong);

【讨论】:

  • 我喜欢这个解决方案的一点是,初始变量只使用一次。这使得在我的代码中创建“长链”成为可能——我不必将值存储在变量中。
  • 我喜欢它不使用旧的 if else 语法,而只使用闪亮的新 java-8 语法!
  • @slartidan 很好,但仍然if/else 在过滤器和地图中
【解决方案2】:

我不知道更简单的解决方案,但这将满足您的需求。

OptionalLong secondScreenHeight = OptionalLong.of(32l);
Optional<Long> optional = secondScreenHeight.isPresent() 
    ? Optional.of(secondSceenHeight.getAsLong()) 
    : Optional.empty();
api.setHeight(optional);

【讨论】:

  • 我喜欢这个解决方案,它是可读的,并且重新映射可选的意图是清晰可见的。
【解决方案3】:

还有一种可能性,尽管只有 JDK 9 才通过新的 OptionalLong.stream() 方法返回 LongStream。然后可以将其装箱到Stream&lt;Long&gt;

OptionalLong optionalLong = OptionalLong.of(32);
Optional<Long> optional = optionalLong.stream().boxed().findFirst();

使用 JDK 8 可以完成类似的操作,只需跳出 Guava 中的 Streams 实用程序类:

Optional<Long> optional = Streams.stream(optionalLong).boxed().findFirst();

【讨论】:

  • 另外,findAny 短了 2 个字符。
  • 我喜欢它,它很短并且不依赖于isPresent。然而,意图并不像其他一些答案那样清晰可见。感谢分享这个解决方案!
【解决方案4】:

这应该可以。

Optional<Long> returnValue = Optional.empty();
if(secondScreenHeight.isPresent()) {
      returnValue = Optional.of(secondScreenHeight.getAsLong());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多