gpt4 book ai didi

scala - Scala 中的条件循环转换

转载 作者:行者123 更新时间:2023-12-04 22:17:14 25 4
gpt4 key购买 nike

我想将一段如下所示的 Java 代码转换为 Scala:

for (Iterator<Task> it = tasks.iterator(); it.hasNext() && workflow.isAutoRun();) {
Task task = it.next();
if (!runTask(task)) break;
}

我不喜欢 scala for- 理解(无论如何我都不知道如何打破迭代),我想出了以下几点:
val completed = tasks.forall { task => workflow.isAutoRun && runTask(task) } 

但是, forall 方法的 scaladoc 如下所示(斜体我的):

Apply a predicate p to all elements of this iterable object and return true, iff the predicate yields true for all elements



这不等同于我所做的(因为这意味着将为每个项目评估谓词,无论先前的评估是否返回 false )并且(实际上)实际上并不等同于 forall 方法实际执行的操作,即在 Iterator 上看起来像:
 def forall(p: A => Boolean): Boolean = {
var res = true
while (res && hasNext) res = p(next)
res
}

无论如何,我离题了:有没有人对 Scala 代码应该是什么样子有更好的建议?我想看到更好地传达意图的东西:

tasks.doUntil(t => !isAutoRun || !runTask(t))

最佳答案

与上面 Flaviu 的回答类似,您可以在范围内的某处放置一个隐式定义:

  implicit def conditionalLoop[T](s: Seq[T]) = {
new {
def doWhile(p: T => Boolean): Unit = {
doWhile(s.elements)(p)
}
private def doWhile(it: Iterator[T])(p: T => Boolean): Unit = {
if (it.hasNext && p(it.next)) doWhile(it)(p)
}
}
}

然后,调用很方便:
tasks doWhile {
t => workflow.isAutoRun && t.run
}

关于scala - Scala 中的条件循环转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1530627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com