小编Cer*_*vEd的帖子

中断延迟迭代的功能方式取决于超时和上一个和下一个之间的比较,而 LazyList 与 Stream

背景

我有以下场景。我想重复执行来自外部库的类的方法,并且我想这样做直到满足某个超时条件和结果条件(与之前的结果相比)。此外,我想收集返回值,即使在“失败”运行(带有“失败”结果条件的运行,应该中断进一步执行)。

到目前为止,我已经通过初始化一个 empty var result: Result, avar stop: Boolean并使用一个while在条件为真时运行的循环并修改外部状态来实现这一点。我想摆脱这个并使用功能方法。

一些上下文。每次运行预计运行 0 到 60 分钟,迭代的总时间上限为 60 分钟。理论上,这段时间内执行的次数没有限制,但在实践中,一般是2-60次。

问题是,运行需要很长时间,所以我需要停止执行。我的想法是使用某种懒惰IteratorStream加上scanLeftOption

代码

锅炉板

此代码不是特别相关,但用于我的方法示例并提供相同但有些随机的伪运行时结果。

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)

functional-programming scala

1
推荐指数
1
解决办法
77
查看次数

检查 Seq[T] 是否包含 Option[T]

假设我有以下内容

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)

scala

0
推荐指数
1
解决办法
68
查看次数

标签 统计

scala ×2

functional-programming ×1