_Java.time.Duration
_を_scala.concurrent.duration.FiniteDuration
_に変換するエレガントな方法はありますか?
私は、Scalaで次のConfigの簡単な使用を試みています。
val d = ConfigFactory.load().getDuration("application.someTimeout")
ただし、Scalaで結果を使用する簡単な方法はありません。 Typesafeの善良な人々が私にこれを期待していないことを願っています。
FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)
編集:行にバグがあることに注意してください。以下の選択された回答を参照してください。
明示的な変換が唯一の方法であるかどうかはわかりませんが、適切に変換したい場合は
FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS)
toNanos
は合計期間を返しますが、getNano
はナノ秒のコンポーネントのみを返しますが、これは必要なものではありません。
例えば。
import Java.time.Duration
import jata.time.temporal.ChronoUnit
Duration.of(1, ChronoUnit.HOURS).getNano // 0
Duration.of(1, ChronoUnit.HOURS).toNanos // 3600000000000L
そうは言っても、あなたはあなた自身の暗黙的な変換を行うこともできます
implicit def asFiniteDuration(d: Java.time.Duration) =
scala.concurrent.duration.Duration.fromNanos(d.toNanos)
そして、スコープ内にある場合:
val d: FiniteDuration = ConfigFactory.load().getDuration("application.someTimeout")
より良い方法はわかりませんが、少し短くすることができます:
Duration.fromNanos(d.toNanos)
また、暗黙の変換に自分でラップします
implicit def toFiniteDuration(d: Java.time.Duration): FiniteDuration = Duration.fromNanos(d.toNanos)
(かわった d.toNano
からd.toNanos
)
Scala 2.13
から、JavaのDurationConverter
からscalaのDuration
(およびその逆)への専用の FiniteDuration
があります。
import scala.jdk.DurationConverters._
// val javaDuration = Java.time.Duration.ofNanos(123456)
javaDuration.toScala
// scala.concurrent.duration.FiniteDuration = 123456 nanoseconds
scala-Java8-compat
にはこのための関数があります
build.sbtで
libraryDependencies += "org.scala-lang.modules" %% "scala-Java8-compat" % "0.9.0"
import scala.compat.Java8.DurationConverters._
val javaDuration: Java.time.Duration = ???
val scalaDuration: FiniteDuration = javaDuration.toScala