将Scala选项转换为Java可选

时间:2016-07-12 10:01:26

标签: 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();
}

但我不喜欢它。

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

Options.asJava(option);

8 个答案:

答案 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上使用一些丰富的实用程序,例如:

https://gist.github.com/julienroubieu/fbb7e1467ab44203a09f

https://github.com/scala/scala-java8-compat

答案 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] }