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