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

sna*_*ppy 16 functional-programming scala

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

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

sep*_*p2k 22

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

objects.find(expensiveFunc).orNull
Run Code Online (Sandbox Code Playgroud)

  • 没有必要提到使用`Option`比使用`null`更加惯用......而且更安全. (5认同)
  • 对于好奇,这里是'TraversableLike.find`的库源:https://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_9_0_1/src//library/scala/collection/TraversableLike.scala# L330 (3认同)

par*_*tic 5

首先,不要null在Scala中使用(除了与Java代码交互时),而不要使用Options.其次,用递归替换循环.第三,看看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
}
Run Code Online (Sandbox Code Playgroud)