Scala中如何将字符串转换为FiniteDuration

22
在Scala中,是否可以在不编写自定义代码的情况下将String解析为FiniteDuration?在Duration上有一个名为create的方法,它接受一个String,但它会产生一个Duration,我不确定如何使用它来创建FiniteDurationDuration上有一些工厂方法可产生FiniteDuration实例,但这些方法需要解析字符串以产生其参数(它们的签名包括一个长整型和一个TimeUnit)。所提到的这些类型来自scala.concurrent.duration
谢谢。
3个回答

31
你可以使用你提到的方法来创建一个Duration对象(或者简单地使用apply方法)。然后,你可以通过collect(因为FiniteDurationDuration的子类型)来检查它是否是FiniteDuration。不过,根据你的用例,有几个不同的变体可供选择:
scala> val finite = Duration("3 seconds")
scala> val infinite = Duration("Inf")
scala> val fd = Some(finite).collect { case d: FiniteDuration => d }
fd: Option[scala.concurrent.duration.FiniteDuration] = Some(3 seconds)
scala> val id = Some(infinite).collect { case d: FiniteDuration => d }
id: Option[scala.concurrent.duration.FiniteDuration] = None

希望对你有所帮助。


5
非常感谢!在看到你的评论之前,我已经这样做了:Duration.apply(myString).asInstanceOf[FiniteDuration],但这意味着myString将始终指代一个有限的持续时间,所以它并不是万无一失的。 - user2916547

4
如果你使用的是Scala 2.13或更高版本,你也可以利用isFinite方法来获取Duration对象的Option[FiniteDuration],通过Option.when的帮助。
这是一个示例,演示如何实现上述内容:
val dA: Duration = Duration("Inf")
val dB: Duration = Duration("48 hours")

val a = Option.when(dA.isFinite)(dA.asInstanceOf[FiniteDuration])
val b = Option.when(dB.isFinite)(dB.asInstanceOf[FiniteDuration])

println(a) // -> None
println(b) // -> Some(2 days)

您还可以编写隐式转换,以帮助您将所有Duration转换为Option[FiniteDuration],如下所示...
implicit val durationToFinite: Duration => Option[FiniteDuration] = 
  d => Option.when(d.isFinite)(d.asInstanceOf[FiniteDuration])

val finiteDurationD: Option[FiniteDuration] = Duration("Int")
val finiteDurationE: Option[FiniteDuration] = Duration("48 hours")

println(finiteDurationD) // -> None
println(finiteDurationE) // Some(2 days)


0

使用 .toMinutes 和类似的函数也是一个简单的解决方案。

FiniteDuration(Duration("48 hours").toMinutes, MINUTES)

完整示例:

scala> import scala.concurrent.duration._
import scala.concurrent.duration._

scala> FiniteDuration(Duration("48 hours").toMinutes, MINUTES)
res0: scala.concurrent.duration.FiniteDuration = 2880 minutes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接