我需要将Scala Option转换为Java Optional。我设法写了这个:
public <T> Optional<T> convertOption2Optional(Option<T> option) {
return option.isDefined() ? Optional.of(option.get()) : Optional.empty();
}
但我不喜欢它。
有没有简单的方法,或内置的scala转换器? 我正在寻找类似的东西:
Options.asJava(option);
答案 0 :(得分:9)
我在Java中可以想到的最短路径是:
Optional.ofNullable(option.getOrElse(null))
@RégisJean-Gilles实际上建议如果你在Scala中编写转换更短:
Optional.ofNullable(option.orNull)
顺便说一下,在Scala 2.12尚未正式发布之前,你必须知道Scala不支持Java 8。查看docs(可能会在发布前更改)JavaConversions
中没有此类转化。
答案 1 :(得分:3)
您还可以在github上使用一些丰富的实用程序,例如:
答案 2 :(得分:2)
我这样做:
import java.util.{Optional => JOption}
package object myscala {
implicit final class RichJOption[T](val optional: JOption[T]) {
def asScala: Option[T] = optional match {
case null => null
case _ => if (optional.isPresent) Option(optional.get()) else None
}
}
implicit final class RichOption[T](val option: Option[T]) {
def asJava: JOption[T] = option match {
case null => null
case _ => if (option.isDefined) JOption.of(option.get) else JOption.empty()
}
}
}
所以,你可以像这样使用它,:))
import myscala._
object Main extends App {
val scalaOption = java.util.Optional.ofNullable("test").asScala
println(scalaOption)
val javaOption = Option("test").asJava
println(javaOption)
}
答案 3 :(得分:2)
从Scala 2.13
开始,有一个专用转换器,从scala的Option
到Java的Optional
。
从Java(显式方式):
import scala.jdk.OptionConverters
// val option: Option[Int] = Some(42)
OptionConverters.toJava(option)
// java.util.Optional[Int] = Optional[42]
从Scala(以隐式方式):
import scala.jdk.OptionConverters.Ops._
// val option: Option[Int] = Some(42)
option.toJava
// java.util.Optional[Int] = Optional[42]
答案 4 :(得分:1)
对于某个类的给定输入参数opt: Option[T]
,
您可以在该类中定义一个方法,如下所示:
def toOptional(implicit ev: Null <:< T): Optional[T] = Optional.ofNullable(opt.orNull)
。
答案 5 :(得分:1)
现在有一个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
}
更多详细信息here。
答案 6 :(得分:-1)
另一个好的lib:
https://github.com/AVSystem/scala-commons
import com.avsystem.commons.jiop.JavaInterop._
Optional.of("anything").asScala
答案 7 :(得分:-1)
例如,Scala 2.13 在 scala.jdk.OptionConverters.{RichOption, FutureConverters}
中有一些有用的转换器。
RichOption 添加了用于在 Scala 和 Java 选项之间转换的隐式方法,因此您可以执行此操作...
import scala.jdk.OptionConverters.RichOption
val scalaOpt = Some("hello")
val javaOpt = scalaOpt.toJava
在幕后,这只是 scala 选项的匹配语句...
def toJava: Optional[A] = o match { case Some(a) => Optional.ofNullable(a); case _ => Optional.empty[A] }