2015-08-18 6 views
28

Gibt es eine elegante Möglichkeit, java.time.Duration in scala.concurrent.duration.FiniteDuration zu konvertieren?Konvertieren von Java in Scala-Dauern

Ich versuche, die folgende einfache Verwendung von Config in Scala zu tun:

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

Allerdings kann ich keine einfache Art und Weise sehen das Ergebnis in Scala zu verwenden. hoffen natürlich die gut Leute von Typesafe nicht erwarten, dass mir dies tun:

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

Edit: Beachten Sie die Zeile einen Fehler hat, die den Punkt beweist. Siehe die ausgewählte Antwort unten.

+0

Was ist mit der gezeigten Lösung ist falsch? Dies ist einfach und verständlich. Wickeln Sie es in eine Funktion/erstellen Sie eine implizite Konvertierung, wenn es nicht kurz genug für Sie ist. – sschaef

+0

@sschaef das störende Bit ist eine angebliche "scala-freundliche" Bibliothek, um Java-Typen auszuspucken, aber das ist keine neue Sache, wenn man von Config spricht. –

+0

Typesafe Config bedient sowohl Java als auch Scala Clients nach seiner Projektdefinition. Ich stimme zu, dass die Verwendung einer impliziten Konvertierung ein wenig überraschend ist. Ich behandle dies innerhalb des MyConfig-Singleton, so dass der Anwendungscode dies niemals wissen muss. Raw TypeSafe Config-Zugriffe sollten nicht in Code der Anwendungsebene gestreut werden. – akauppi

Antwort

29

Ich weiß nicht, ob eine explizite Konvertierung der einzige Weg ist, aber wenn Sie es richtig machen wollen

FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS) 

toNanos wird die Gesamtdauer zurückkehren, während getNano wird nur die ns-Komponente, die nicht das, was Sie wollen.

z.

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

Dass gesagt wird, können Sie auch Ihre eigene implizite Konvertierung

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

und wenn Sie es in ihrem Umfang haben:

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

Sie meinen wahrscheinlich "NANOSECONDS", nicht "NOSECONDS". –

+0

@AlexeyRomanov guten Fang, danke –

14

Ich kenne keinen besseren Weg, aber man kann es kürzer etwas machen:

Duration.fromNanos(d.toNanos) 

und es auch wickeln in eine implizite Konvertierung selbst

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

(geändert d.toNano-d.toNanos)