ScalaオプションをJavaオプションに変換する必要があります。私はこれをなんとか書いています:
public <T> Optional<T> convertOption2Optional(Option<T> option) {
return option.isDefined() ? Optional.of(option.get()) : Optional.empty();
}
しかし、私はそれが好きではありません。
それを行う簡単な方法、または組み込みのscalaコンバーター)はありますか?私は次のようなものを探しています:
Options.asJava(option);
Javaで私が考えることができる最も短い方法は:
Optional.ofNullable(option.getOrElse(null))
@RégisJean-Gillesは、Scalaで変換を記述している場合、実際にはさらに短いことを提案しました。
Optional.ofNullable(option.orNull)
ちなみに、ScalaはJava 8をサポートしていませんScala 2.12まではまだ正式にはリリースされていません。 。 docs (リリースまでに変更される可能性があります)を見ると、JavaConversions
にはそのような変換はありません。
現在、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
}
詳細 こちら 。
開始中Scala 2.13
、scalaのOption
からJavaのOptional
への専用コンバーターがあります。
Javaから (explicitの方法):
import scala.jdk.javaapi.OptionConverters;
// val option: Option[Int] = Some(42)
OptionConverters.toJava(option);
// Java.util.Optional[Int] = Optional[42]
Scalaから (implicitの方法):
import scala.jdk.OptionConverters._
// val option: Option[Int] = Some(42)
option.toJava
// Java.util.Optional[Int] = Optional[42]
私はこれをやっています:
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)
}
Githubにある豊富なユーティリティのいくつかを使用することもできます。例:
あるクラスの特定の入力パラメーター_opt: Option[T]
_に対して、次のようにそのクラス内にメソッドを定義できます。
def toOptional(implicit ev: Null <:< T): Optional[T] = Optional.ofNullable(opt.orNull)
。