用于循环的早期退出的功能代码

时间:2011-07-18 07:24:42

标签: scala functional-programming

如何在功能样式(scala idiomatic)中重构此代码

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

3 个答案:

答案 0 :(得分:22)

这几乎就是find方法的作用,除了它返回Option。因此,如果您想要这种确切的行为,可以添加对Option.orNull的调用,如下所示:

objects.find(expensiveFunc).orNull

答案 1 :(得分:5)

首先,不要在Scala中使用null(与Java代码交互时除外),而不要使用选项。其次,用递归替换循环。第三,看看Scala函数的丰富API,你正在寻找的方法已经存在,如 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
}

答案 2 :(得分:0)

折叠怎么样?

我们以某种方式伪成本的功能:

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)