web-dev-qa-db-fra.com

Conversion de Java en Scala

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.

41
Jacob Eckel

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

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)

18
Tyth

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

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