Я бы хотел преобразовать фрагмент кода 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
выглядит следующим образом (курсив мой):
Примените предикат p
ко всем элементам этого итерируемого объекта и верните true, если только предикат выдает true для всех элементов
Это не эквивалентно тому, что я сделал (поскольку это означает, что предикат будет оцениваться для каждого элемента независимо от того, вернулась ли предыдущая оценка false
) и (на самом деле) фактически не эквивалентно тому, что 1021 * метод на самом деле, который на Iterator
выглядит так:
def forall(p: A => Boolean): Boolean = {
var res = true
while (res && hasNext) res = p(next)
res
}
В любом случае, я отвлекся: есть ли у кого-нибудь лучшие предложения о том, как должен выглядеть код scala? Я хочу увидеть что-то, что лучше передает цель:
tasks.doUntil(t => !isAutoRun || !runTask(t))