web-dev-qa-db-ja.com

ScalaオプションをJavaオプションに変換

ScalaオプションをJavaオプションに変換する必要があります。私はこれをなんとか書いています:

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

しかし、私はそれが好きではありません。

それを行う簡単な方法、または組み込みのscalaコンバーター)はありますか?私は次のようなものを探しています:

Options.asJava(option);
13
mjjaniec

Javaで私が考えることができる最も短い方法は:

Optional.ofNullable(option.getOrElse(null))

@RégisJean-Gillesは、Scalaで変換を記述している場合、実際にはさらに短いことを提案しました。

Optional.ofNullable(option.orNull)

ちなみに、ScalaはJava 8をサポートしていませんScala 2.12まではまだ正式にはリリースされていません。 。 docs (リリースまでに変更される可能性があります)を見ると、JavaConversionsにはそのような変換はありません。

10
Dici

現在、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
}

詳細 こちら

6
Java Xu

開始中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]
4
Xavier Guihot

私はこれをやっています:

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)

}
2
Zhuo YING

Githubにある豊富なユーティリティのいくつかを使用することもできます。例:

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

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

2
Michal M

あるクラスの特定の入力パラメーター_opt: Option[T]_に対して、次のようにそのクラス内にメソッドを定義できます。

def toOptional(implicit ev: Null <:< T): Optional[T] = Optional.ofNullable(opt.orNull)

1
Hari Bage