如何避免Scala中的可变局部变量?
避免在Scala中使用可变变量被认为是一种很好的做法 来自“Scala编程,第二版”,第52页:“Scala允许您以命令式风格编程,但鼓励您采用更具功能性的风格”以及后来的“Scala鼓励您倾向于VAL,但最终在手头的工作中使用最佳工具。” 如何使这个命令式构造在Scala中变得优雅(关注变量计数): 您使用什么结构或模式将命令式风格的代码转换为函数式风格?如何避免Scala中的可变局部变量?,scala,immutability,Scala,Immutability,避免在Scala中使用可变变量被认为是一种很好的做法 来自“Scala编程,第二版”,第52页:“Scala允许您以命令式风格编程,但鼓励您采用更具功能性的风格”以及后来的“Scala鼓励您倾向于VAL,但最终在手头的工作中使用最佳工具。” 如何使这个命令式构造在Scala中变得优雅(关注变量计数): 您使用什么结构或模式将命令式风格的代码转换为函数式风格? 您是否使用Option类或其他构造?不确定您是否提供了足够的上下文,但以下内容如何: val foo = getRequest() va
您是否使用Option类或其他构造?不确定您是否提供了足够的上下文,但以下内容如何:
val foo = getRequest()
val count = if (foo.isJsonObject) doSomething(foo) else 0
if (count > 0) {
specialCall()
} else {
defaultCall()
}
通常情况下,Scala API一般(集合、
选项、尝试、未来等)及其操作(映射、平面映射、过滤器、折叠等)允许您非常简洁地表达大多数命令式结构。@ale64位答案很好,但您可以将其表达得更短
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条件(通过模式匹配),但这可能会降低代码的可读性。我喜欢它,因为它优雅简洁。这里使用的模式是面向表达式的。因此,通常我们不认为控制流操作(if
,try
,match
)是计算结果值的表达式,但在Scala和其他类似语言中它们是。
val count = Try(getRequest).filter(_.isJsonObject).map(doSomething).getOrElse(0)
if (count > 0) {
specialCall()
} else {
defaultCall()
}