2015-08-18 29 views
28

Czy istnieje elegancki sposób konwersji java.time.Duration na scala.concurrent.duration.FiniteDuration?Konwersja Java na okresy Scala

Próbuję wykonać następujące proste użycie Config w Scala:

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

jednak nie widzę żadnego prostego sposobu korzystania wynik w Scala. nadzieję dobrzy ludzie Typesafe nie oczekują ode mnie, aby to zrobić:

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

Edit: Uwaga linia ma błąd, który świadczy o punkt. Zobacz wybraną odpowiedź poniżej.

+0

Co jest nie tak z przedstawionego rozwiązania? Jest to łatwe i zrozumiałe. Zawiń go w funkcję/utwórz niejawną konwersję, jeśli nie jest wystarczająco krótka dla ciebie. – sschaef

+0

@sschaef the bothering bit jest biblioteką "przyjazną dla scali", która wypluwa typy Java, ale nie jest to nowa rzecz, gdy mówimy o Config. –

+0

Typesafe Config obsługuje zarówno klientów Java, jak i Scala, zgodnie z definicją projektu. Zgadzam się, że użycie niejawnej konwersji jest nieco zaskakujące. Obejmuję to w Singleton MyConfig, więc kod aplikacji nigdy nie będzie musiał wiedzieć. Nie należy posypywać surowymi dostępami do konfiguracji Typesafe w kodzie poziomu aplikacji. – akauppi

Odpowiedz

29

Nie wiem, czy wyraźna konwersja jest jedyną metodą, ale jeśli chcesz to zrobić poprawnie

FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS) 

toNanos zwróci całkowity czas trwania, natomiast getNano będzie zawierał tylko składnik nanosekundowy, co nie jest tym, czego potrzebujesz.

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 

Mając na uwadze powyższe, można również toczyć własną niejawna konwersja

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

i kiedy masz to w zakresie:

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

Prawdopodobnie masz na myśli 'NANOSECONDS', a nie' NOSECONDS'. –

+0

@AlexeyRomanov dobry połów, dzięki –

14

Nie znam lepszy sposób, ale można zrobić to nieco krócej:

Duration.fromNanos(d.toNanos) 

a także owinąć go w niejawna konwersja sobie

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

(zmienił d.toNano do d.toNanos)