Подтвердить что ты не робот

Преобразование Java в Scala продолжительности

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

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

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

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

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

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

4b9b3361

Ответ 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