【问题标题】:How to avoid mutable local variables in Scala?如何避免Scala中的可变局部变量?
【发布时间】:2016-10-18 21:00:01
【问题描述】:

在 Scala 中避免使用可变变量被认为是一种好习惯。

来自“Scala 编程,第 2 版”,第 52 页:“Scala 允许您以命令式风格进行编程,但鼓励您采用更具功能性的风格”和后来的“Scala 鼓励您倾向于 vals,但最终考虑到手头的工作,争取最好的工具。”

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

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

您使用什么构造或模式将命令式代码转换为函数式代码? 您是否使用 Option 类或其他一些构造?

【问题讨论】:

  • 这里使用的模式是表达式方向。所以通常我们不会将控制流操作(iftrymatch)视为计算结果值的表达式,但在 Scala 和其他类似语言中它们是。

标签: scala immutability


【解决方案1】:

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

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

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

【讨论】:

  • 我喜欢它,因为它优雅简洁。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    val count = Try(getRequest).filter(_.isJsonObject).map(doSomething).getOrElse(0)
    
    if (count > 0) {
      specialCall()
    } else {
      defaultCall()
    }
    

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

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2012-12-19
      • 2010-12-22
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多