Existe-t-il un moyen élégant de convertir Java.time.Duration
En scala.concurrent.duration.FiniteDuration
?
J'essaie de faire la simple utilisation suivante de Config dans Scala:
val d = ConfigFactory.load().getDuration("application.someTimeout")
Cependant, je ne vois aucun moyen simple d'utiliser le résultat dans Scala. J'espère que les bonnes gens de Typesafe ne s'attendaient pas à ce que je fasse cela:
FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)
Edit: Notez que la ligne a un bug, ce qui prouve le point. Voir la réponse sélectionnée ci-dessous.
Je ne sais pas si une conversion explicite est le seul moyen, mais si vous voulez le faire correctement
FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS)
toNanos
renverra la durée totale, tandis que getNano
ne fera que le composant nanosecondes, ce qui n'est pas ce que vous voulez.
Par exemple.
import Java.time.Duration
import jata.time.temporal.ChronoUnit
Duration.of(1, ChronoUnit.HOURS).getNano // 0
Duration.of(1, ChronoUnit.HOURS).toNanos // 3600000000000L
Cela étant dit, vous pouvez également lancer votre propre conversion implicite
implicit def asFiniteDuration(d: Java.time.Duration) =
scala.concurrent.duration.Duration.fromNanos(d.toNanos)
et quand vous l'avez dans la portée:
val d: FiniteDuration = ConfigFactory.load().getDuration("application.someTimeout")
Je ne connais pas de meilleur moyen, mais vous pouvez le raccourcir un peu:
Duration.fromNanos(d.toNanos)
et aussi envelopper vous-même dans une conversion implicite
implicit def toFiniteDuration(d: Java.time.Duration): FiniteDuration = Duration.fromNanos(d.toNanos)
(modifié d.toNano
à d.toNanos
)
Démarrage Scala 2.13
, il y a un DurationConverter
dédié de Java Duration
à scala FiniteDuration
(et vice versa):
import scala.jdk.DurationConverters._
// val javaDuration = Java.time.Duration.ofNanos(123456)
javaDuration.toScala
// scala.concurrent.duration.FiniteDuration = 123456 nanoseconds
Il y a une fonction pour cela dans scala-Java8-compat
dans 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