Scala:如何在这里避免使用 var

Scala: How to avoid var here

我有这样的代码片段:

def until(terminationCond: List[A]=>Boolean, combiner: List[A]=>List[A] )(obj: List[A]): A = {
      var tempObj = obj
      while(!terminationCond(tempObj)) {
          tempObj = combiner(obj)
      }
    tempObj.head
    }

我正在寻找一种从函数式编程风格编写这段代码的方法,避免任何可变类型。

使用递归:

@tailrec
def doUntilTerm(obj: List[A]) = 
          if (terminationCond(obj)) obj.head else doUntilTerm(obj)

我发现以下比显式递归版本更具声明性:

def until[A](
  terminationCond: List[A] => Boolean,
  combiner: List[A] => List[A]
)(obj: List[A]): A =
  Stream.iterate(obj)(combiner).dropWhile(!terminationCond(_)).head.head

即我们通过迭代应用 combiner 创建一个结果流,只要终止条件不成立就丢弃,然后 return 它满足的第一个的头部。