Scala处理不可变列表的方式/习惯用法



我发现使用不可变列表的想法是成功的,但是当谈到这里的这段代码时,我被难住了。我发现自己写的东西更像Java而不是Scala风格。我宁愿使用List(...)而不是Buffer(...),但我不知道如何将相同的修改不可变List传递给下一个函数。guesseseliminate(...)内也进行了修改。

如果有任何建议可以帮助我使Scala的方式做到这一点,我将不胜感激。由于

    val randomGuesses = List(...) // some long list of random integers
    val guesses = randomGuesses.zipWithIndex.toBuffer
for ( s <- loop()) {
    val results = alphaSearch(guesses)
    if (results.size == 1) {
        guesses(resultes.head._2) = results.head._1
        eliminate(guesses, resultes.head._2)
        }
    else {
      val results = betaSearch(guesses)
      if (results.size == 1) {
        guesses(resultes.head._2) = results.head._1
        eliminate(guesses, resultes.head._2)
      } else {
          val results = betaSearch(guesses)      
          if (results.size == 1) {
            guesses(resultes.head._2) = results.head._1
            eliminate(guesses, resultes.head._2)  
          }
      }
    }
}

这里有一些通用提示,因为这可能更适合codereview,并且所发布的代码不完整,没有示例。

您可以使用模式匹配代替ifelse来检查大小

results.size match{
  case 1 => ... //Code in the if block
  case _ => ... //Code in the else block
}

创建一个新的List,而不是改变guesses

val newGuesses = ...

newGuesses传递给eliminate

最后,看起来eliminate修改了guesses。将其更改为返回一个新列表。例如

def eliminate(list: List[Int]) = {
 //Eliminate something from list and return a new `List`
}