Функциональный код для циклизации с ранним выходом
Как я могу реорганизовать этот код в функциональном стиле (scala idiomatic)
def findFirst[T](objects: List[T]):T = {
for (obj <- objects) {
if (expensiveFunc(obj) != null) return obj
}
null.asInstanceOf[T]
}
Ответ 1
Это почти то же, что делает метод find, за исключением того, что он возвращает Option. Поэтому, если вам нужно это точное поведение, вы можете добавить вызов Option.orNull, например:
objects.find(expensiveFunc).orNull
Ответ 2
Во-первых, не используйте null в Scala (за исключением случаев взаимодействия с Java-кодом), кроме параметров. Во-вторых, замените циклы на рекурсию. В-третьих, посмотрите на богатый API функций Scala, метод, который вы ищете, уже существует, как указано sepp2k.
Для изучения puprose ваш пример можно переписать как:
def findFirst[T](objects: List[T]):Option[T] = objects match {
case first :: rest if expensiveFunc( first ) != null => Some( first )
case _ :: rest => findFirst( rest )
case Nil => None
}