Jac*_*kel 41 scala duration config scala-java-interop
是否有一种优雅的方式转换java.time.Duration为scala.concurrent.duration.FiniteDuration?
我试图在Scala中进行以下简单的Config使用:
val d = ConfigFactory.load().getDuration("application.someTimeout")
但是我没有看到在Scala中使用结果的任何简单方法.当然希望Typesafe的好人不要指望我这样做:
FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)
编辑:注意该行有一个错误,这证明了这一点.请参阅下面的选定答案.
Gab*_*lla 43
我不知道显式转换是否是唯一的方法,但如果你想做正确的话
FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
话虽这么说,你也可以推出自己的隐式转换
implicit def asFiniteDuration(d: java.time.Duration) =
scala.concurrent.duration.Duration.fromNanos(d.toNanos)
Run Code Online (Sandbox Code Playgroud)
当你在范围内:
val d: FiniteDuration = ConfigFactory.load().getDuration("application.someTimeout")
Run Code Online (Sandbox Code Playgroud)
Tyt*_*yth 18
我不知道有什么更好的方法,但你可以把它缩短一点:
Duration.fromNanos(d.toNanos)
Run Code Online (Sandbox Code Playgroud)
并自己将其包装成隐式转换
implicit def toFiniteDuration(d: java.time.Duration): FiniteDuration = Duration.fromNanos(d.toNanos)
Run Code Online (Sandbox Code Playgroud)
(变更d.toNano到d.toNanos)
从开始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
Run Code Online (Sandbox Code Playgroud)
有一个功能 scala-java8-compat
在 build.sbt
libraryDependencies += "org.scala-lang.modules" %% "scala-java8-compat" % "0.9.0"
Run Code Online (Sandbox Code Playgroud)
import scala.compat.java8.DurationConverters._
val javaDuration: java.time.Duration = ???
val scalaDuration: FiniteDuration = javaDuration.toScala
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11424 次 |
| 最近记录: |