如何避免 Scala 中的可变局部变量?

How to avoid mutable local variables in Scala?

避免在 Scala 中使用可变变量被认为是一种很好的做法。

来自 "Programming in Scala, 2nd Edition",第 52 页:"Scala allows you to program in an imperative style, but encourages you to adopt a more functional style" 及更高版本 "Scala encourages you to lean towards vals, but ultimately reach for the best tool given the job at hand."

如何在 Scala 中使这个命令式结构变得优雅(关注变量 count):

var count = 0
val foo  = getRequest()
if(foo.isJsonObject){
  count = doSomething(foo)
}
if(count>0){
  specialCall()
} else{
  defaultCall()
}

您使用什么构造或模式将命令式风格的代码转换为函数式风格的代码? 您使用选项 class 还是其他一些结构?

不确定您是否提供了足够的上下文,但是怎么样:

val foo  = getRequest()
val count = if (foo.isJsonObject) doSomething(foo) else 0
if (count > 0) {
  specialCall()
} else {
  defaultCall()
}

通常,Scala API 一般(集合、OptionTryFuture 等)及其操作(mapflatMapfilterfold 等)允许您非常简洁地表达大多数命令式结构。

@ale64bit 的回答很好,但你可以把它表达得更短

val foo  = getRequest()
if (foo.isJsonObject && doSomething(foo)>0)  
   specialCall()
else 
   defaultCall()

有很多方法可以做到这一点。

val count = Try(getRequest).filter(_.isJsonObject).map(doSomething).getOrElse(0)

if (count > 0) {
  specialCall()
} else {
  defaultCall()
}

您甚至可以避免 if-else 条件(通过模式匹配),但这可能会降低代码的可读性。