2015-08-18 16 views
28

Esiste un modo elegante per convertire java.time.Duration in scala.concurrent.duration.FiniteDuration?Conversione di durate Java in scala

io sto cercando di fare la seguente semplice utilizzo di Config in Scala:

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

Tuttavia non vedo alcun modo semplice per utilizzare il risultato a Scala. speranza Certamente la buona gente di Typesafe non si aspettavano che io faccia questo:

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

Edit: Si noti la linea ha un bug, il che dimostra il punto. Vedi la risposta selezionata sotto.

+0

Cosa c'è di sbagliato con la soluzione indicata? Questo è facile e comprensibile. Avvolgilo in una funzione/crea una conversione implicita se non è abbastanza breve per te. – sschaef

+0

@sschaef il bit fastidioso è una supposta libreria "scala-friendly" per sputare i tipi Java, ma questa non è una cosa nuova quando si parla di Config. –

+0

Typesafe Config sta servendo sia i client Java che i programmi Scala, in base alla definizione del progetto. Sono d'accordo sul fatto che dover utilizzare una conversione implicita è un po 'sorprendente. Lo copro all'interno del singleton MyConfig, quindi il codice dell'applicazione non avrà mai bisogno di sapere. Non si dovrebbero cospargere gli accessi di configurazione Typesafe non elaborati nel codice a livello di applicazione. – akauppi

risposta

29

Non so se una conversione esplicita è l'unico modo, ma se si vuole farlo bene

FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS) 

toNanos tornerà la durata complessiva, mentre getNano sarà solo la componente nanosecondi, che non è quello che si desidera.

E.g.

import java.time.Duration 
import jata.time.temporal.ChronoUnit 
Duration.of(1, ChronoUnit.HOURS).getNano // 0 
Duration.of(1, ChronoUnit.HOURS).toNanos // 3600000000000L 

Detto questo, si può anche rotolare il proprio conversione implicita

implicit def asFiniteDuration(d: java.time.Duration) = 
    scala.concurrent.duration.Duration.fromNanos(d.toNanos) 

e quando lo avete in ambito:

val d: FiniteDuration = ConfigFactory.load().getDuration("application.someTimeout") 
+0

Probabilmente vuoi dire "NANOSECONDI", non "NOSECONDI". –

+0

@AlexeyRomanov buona cattura, grazie –

14

non so un modo migliore, ma si può rendere un po 'più corta:

Duration.fromNanos(d.toNanos) 

e anche avvolgere in una conversione implicita da soli

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

(cambiato d.toNano-d.toNanos)