Функциональный код для зацикливания с ранним выходом - PullRequest
16 голосов
/ 18 июля 2011

Как мне выполнить рефакторинг этого кода в функциональном стиле (scala idiomatic)

def findFirst[T](objects: List[T]):T = {
  for (obj <- objects) {
    if (expensiveFunc(obj) != null) return obj
  }
  null.asInstanceOf[T]
}

Ответы [ 3 ]

22 голосов
/ 18 июля 2011

Это почти точно то, что делает метод find, за исключением того, что он возвращает Option. Поэтому, если вам нужно именно такое поведение, вы можете добавить вызов к Option.orNull, например так:

objects.find(expensiveFunc).orNull
5 голосов
/ 18 июля 2011

Во-первых, не используйте null в Scala (за исключением случаев взаимодействия с кодом Java), но используйте Options.Во-вторых, замените петли рекурсией.В-третьих, взгляните на богатый API функций Scala. Метод, который вы ищете, уже существует, как указано sepp2k .

.*

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
}
0 голосов
/ 06 августа 2011

Как насчет сгиба?

Наша как-то псевдо-дорогая функция:

scala> def divByFive (n: Int) : Option[Int] = {
     | println ("processing " + n)               
     | if (n % 5 == 0) Some (n) else None } 
divByFive: (n: Int)Option[Int]   

Складывание по выбору:

scala> ((None: Option[Int]) /: (1 to 11)) ((a, b) => 
     |   if (a != None) a else divByFive (b)) 
processing 1
processing 2
processing 3
processing 4
processing 5
res69: Option[Int] = Some(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...