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

时间:2016-10-18 21:00:01

标签: scala immutability

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

来自“Scala编程,第2版”,第52页:“Scala允许您以强制性的方式编程,但鼓励您采用更具功能性的风格”,后来“Scala鼓励您倾向于使用val,但最终考虑到手头的工作,找到最好的工具。“

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

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

您使用什么构造或模式将命令式样式转换为功能样式? 您是否使用了Option类或其他一些构造?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

@ ale64bit答案很好,但你可以表达更短

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

答案 2 :(得分:1)

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

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

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

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