将Scala选项转换为Java可选

mjj*_*iec 10 java scala scala-java-interop

我需要将Scala Option转换为Java Optional.我设法写了这个:

public <T> Optional<T> convertOption2Optional(Option<T> option) {
    return option.isDefined() ? Optional.of(option.get()) : Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)

但我不喜欢它.

有一个简单的方法,或内置的scala转换器?我正在寻找类似的东西:

Options.asJava(option);
Run Code Online (Sandbox Code Playgroud)

Xav*_*hot 14

首先Scala 2.13,有一个从 scalaOption到 java 的专用转换器Optional

从 Java显式方式):

import scala.jdk.javaapi.OptionConverters;

// val option: Option[Int] = Some(42)
OptionConverters.toJava(option);
// java.util.Optional[Int] = Optional[42]
Run Code Online (Sandbox Code Playgroud)

从 Scala隐式方式):

import scala.jdk.OptionConverters._

// val option: Option[Int] = Some(42)
option.toJava
// java.util.Optional[Int] = Optional[42]
Run Code Online (Sandbox Code Playgroud)


Dic*_*ici 10

我能用Java思考的最短路径是:

Optional.ofNullable(option.getOrElse(null))
Run Code Online (Sandbox Code Playgroud)

如果你在Scala中编写转换,@RégisJean-Gilles实际上建议更短:

Optional.ofNullable(option.orNull)
Run Code Online (Sandbox Code Playgroud)

顺便说一下,在Scala 2.12尚未正式发布之前,你必须知道Scala不支持Java 8.查看文档(可能会在发布之前发生变化),没有这样的转换JavaConversions.

  • 第一个在 Java 中不起作用。`None.getOrElse(null)` 会抛出一个 NPE,因为 `getOrElse` 接受一个按名称参数,该参数会转换为 `scala.Function0`。 (4认同)
  • `option.getOrElse(null)`可以缩写为`option.orNull` (3认同)
  • http://stackoverflow.com/questions/38320708/implicit-conversion-between-java-and-scala-collections-using-javaconversions/38320930#38320930 (2认同)

Jav*_* Xu 5

asJava现在有解决方案!可从下载2.10

例:

import scala.compat.java8.OptionConverters._

class Test {
  val o = Option(2.7)
  val oj = o.asJava        // Optional[Double]
  val ojd = o.asPrimitive  // OptionalDouble
  val ojds = ojd.asScala   // Option(2.7) again
}
Run Code Online (Sandbox Code Playgroud)

更多细节在这里