Преобразование продолжительности Java в Scala
Есть ли элегантный способ конвертировать java.time.Duration
в scala.concurrent.duration.FiniteDuration
?
Я пытаюсь сделать следующее простое использование Config в Scala:
val d = ConfigFactory.load().getDuration("application.someTimeout")
Однако я не вижу простого способа использовать результат в Scala. Надеюсь, хорошие люди Typesafe не ожидали, что я сделаю это:
FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)
Редактировать: Обратите внимание, что в строке есть ошибка, которая подтверждает эту точку. Смотрите выбранный ответ ниже.
2 ответа
Я не знаю, является ли явное преобразование единственным способом, но если вы хотите сделать это правильно
FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS)
toNanos
вернет общую продолжительность, в то время как getNano
будет только компонент наносекунд, что не то, что вы хотите.
Например
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")
Начало Scala 2.13
есть выделенный DurationConverter
от Явы Duration
к скале FiniteDuration
(и наоборот):
import scala.jdk.DurationConverters.Ops._
// val javaDuration = java.time.Duration.ofNanos(123456)
javaDuration.toScala
// scala.concurrent.duration.FiniteDuration = 123456 nanoseconds
Я не знаю лучшего способа, но вы можете сделать его немного короче:
Duration.fromNanos(d.toNanos)
а также оберните его в неявное преобразование самостоятельно
implicit def toFiniteDuration(d: java.time.Duration): FiniteDuration = Duration.fromNanos(d.toNanos)
(изменен d.toNano
в d.toNanos
)
Для этого есть функция scala-java8-compat
в 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