2015-08-18 5 views
28

Есть ли элегантный способ конвертировать java.time.Duration в scala.concurrent.duration.FiniteDuration?Преобразование Java в Scala длительности

Я пытаюсь сделать следующее простое использование Config в Scala:

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

Однако я не вижу простой способ использовать результат в Scala. Конечно надеюсь, хорошие люди типизированного не ожидал, что мне сделать это:

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

Edit: Обратите внимание, что строка содержит ошибку, которая доказывает точку. См. Выбранный ответ ниже.

+0

Что с проявленное решением? Это легко и понятно. Оберните его в функцию/создайте неявное преобразование, если оно недостаточно для вас. – sschaef

+0

@sschaef bothering bit - предположительная «scala-friendly» библиотека, чтобы выплевывать Java-типы, но это не новость, когда вы говорите о Config. –

+0

Configafe Config служит как клиентам Java, так и Scala, по определению его проекта. Я согласен, что использование неявного преобразования немного удивительно. Я рассказываю об этом в однопользовательском режиме MyConfig, поэтому код приложения никогда не понадобится знать. Не следует посыпать raw Configafe Config access в коде уровня приложения. – akauppi

ответ

29

Я не знаю, является ли явное преобразование единственным способом, но если вы хотите сделать это правильно

FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS) 

toNanos возвращает общую длительность, в то время как getNano будет только компонент наносекунд, который не то, что вы хотите.

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 

При этом, вы можете свернуть свой собственный неявное преобразование

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

и когда вы его в объеме:

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

Вы, вероятно, имеете в виду 'NANOSECONDS', а не' NOSECONDS'. –

+0

@AlexeyRomanov хороший ловушка, спасибо –

14

Я не знаю лучшего способа, но вы можете сделать его немного короче:

Duration.fromNanos(d.toNanos) 

, а также обернуть его в неявном себя

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

(изменен d.toNano к d.toNanos)