Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免Scala中的可变局部变量?_Scala_Immutability - Fatal编程技术网

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

如何避免Scala中的可变局部变量?,scala,immutability,Scala,Immutability,避免在Scala中使用可变变量被认为是一种很好的做法 来自“Scala编程,第二版”,第52页:“Scala允许您以命令式风格编程,但鼓励您采用更具功能性的风格”以及后来的“Scala鼓励您倾向于VAL,但最终在手头的工作中使用最佳工具。” 如何使这个命令式构造在Scala中变得优雅(关注变量计数): 您使用什么结构或模式将命令式风格的代码转换为函数式风格? 您是否使用Option类或其他构造?不确定您是否提供了足够的上下文,但以下内容如何: val foo = getRequest() va

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

来自“Scala编程,第二版”,第52页:“Scala允许您以命令式风格编程,但鼓励您采用更具功能性的风格”以及后来的“Scala鼓励您倾向于VAL,但最终在手头的工作中使用最佳工具。”

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

您使用什么结构或模式将命令式风格的代码转换为函数式风格?
您是否使用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()
}