web-dev-qa-db-ja.com

JavaからScala durationsへの変換

_Java.time.Duration_を_scala.concurrent.duration.FiniteDuration_に変換するエレガントな方法はありますか?

私は、Scalaで次のConfigの簡単な使用を試みています。

val d = ConfigFactory.load().getDuration("application.someTimeout")

ただし、Scalaで結果を使用する簡単な方法はありません。 Typesafeの善良な人々が私にこれを期待していないことを願っています。

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

編集:行にバグがあることに注意してください。以下の選択された回答を参照してください。

41
Jacob Eckel

明示的な変換が唯一の方法であるかどうかはわかりませんが、適切に変換したい場合は

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")
43

より良い方法はわかりませんが、少し短くすることができます:

Duration.fromNanos(d.toNanos)

また、暗黙の変換に自分でラップします

implicit def toFiniteDuration(d: Java.time.Duration): FiniteDuration = Duration.fromNanos(d.toNanos)

(かわった d.toNanoからd.toNanos

18
Tyth

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
7
Xavier Guihot

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
1
Stephen