Abortar cedo em uma dobra
Qual é a melhor maneira de terminar uma dobra cedo? Como exemplo simplificado, imagine que eu queira resumir os números em umIterable
, mas se eu encontrar algo que não estou esperando (digamos, um número ímpar), talvez queira finalizar. Esta é uma primeira aproximação
def sumEvenNumbers(nums: Iterable[Int]): Option[Int] = {
nums.foldLeft (Some(0): Option[Int]) {
case (Some(s), n) if n % 2 == 0 => Some(s + n)
case _ => None
}
}
No entanto, esta solução é muito feia (como em, se eu fiz um .foreach e um retorno - seria muito mais limpo e claro) e pior de tudo, ele percorre todo o iterável mesmo se ele encontrar um número não-par .
Então, qual seria a melhor maneira de escrever uma dobra como essa, que termina cedo? Devo ir e escrever isso de forma recursiva, ou há uma maneira mais aceita?