Преобразование продолжительности 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
Другие вопросы по тегам