我有以下场景。我想重复执行来自外部库的类的方法,并且我想这样做直到满足某个超时条件和结果条件(与之前的结果相比)。此外,我想收集返回值,即使在“失败”运行(带有“失败”结果条件的运行,应该中断进一步执行)。
到目前为止,我已经通过初始化一个 empty var result: Result, avar stop: Boolean并使用一个while在条件为真时运行的循环并修改外部状态来实现这一点。我想摆脱这个并使用功能方法。
一些上下文。每次运行预计运行 0 到 60 分钟,迭代的总时间上限为 60 分钟。理论上,这段时间内执行的次数没有限制,但在实践中,一般是2-60次。
问题是,运行需要很长时间,所以我需要停止执行。我的想法是使用某种懒惰Iterator或Stream加上scanLeft和Option。
此代码不是特别相关,但用于我的方法示例并提供相同但有些随机的伪运行时结果。
import scala.collection.mutable.ListBuffer
import scala.util.Random
val r = Random
r.setSeed(1)
val sleepingTimes: Seq[Int] = (1 to 601)
.map(x => Math.pow(2, x).toInt * r.nextInt(100))
.toList
.filter(_ > 0)
.sorted
val randomRes = r.shuffle((0 to 600).map(x => r.nextInt(10)).toList)
case class Result(val a: Int, val slept: Int)
class Lib() { …Run Code Online (Sandbox Code Playgroud) 假设我有以下内容
case class Foo(a: Option[Int])
val bar = Seq(Foo(Some(0)), Foo(Some(1)), Foo(None))
val baz = Seq(0, 2)
Run Code Online (Sandbox Code Playgroud)
我想检查a类型是否Option[Int]存在于Seq[Int]
这不起作用
bar.map {
case foo: Foo if !baz.contains(foo.a) => Foo(None)
case foo: Foo => foo
}
Run Code Online (Sandbox Code Playgroud)
因为a是类型Option[Int]所以contains(foo.a)总是返回false
我知道我可以执行以下任一操作
bar.map {
case foo: Foo if foo.a.isEmpty || !baz.contains(foo.a.get) => Foo(None)
case foo: Foo => foo
}
bar.map {
case Foo(None) => Foo(None)
case Foo(Some(a)) if !baz.contains(a) => Foo(None)
case foo: Foo => …Run Code Online (Sandbox Code Playgroud)