这篇文章主要介绍“Scala的函数式风格是怎样的”,在日常操作中,相信很多人在Scala的函数式风格是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Scala的函数式风格是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
为牡丹江等地区用户提供了全套网页设计制作服务,及牡丹江网站建设行业解决方案。主营业务为成都网站制作、做网站、牡丹江网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
如果你来自于指令式的背景,如Java,C++,或者C#,你或许认为var是很正统的变量而val是一种特殊类型的变量。相反,如果你来自于函数式背景,如Haskell,OCamel,或Erlang,你或许认为val是一种正统的变量而var有亵渎神灵的血统。然而在Scala看来,val和var只不过是你工具箱里两种不同的工具。它们都很有用,没有一个天生是魔鬼。Scala鼓励你学习val,但也不会责怪你对给定的工作选择最有效的工具。尽管或许你同意这种平衡的哲学,你或许仍然发现***次理解如何从你的代码中去掉var是很挑战的事情。
考虑下面这个改自于第2章的while循环例子,它使用了var并因此属于指令式风格:
def printArgs(args: Array[String]): Unit = { var i = 0 while (i < args.length) { println(args(i)) i += 1 } }
你可以通过去掉var的办法把这个代码变得更函数式风格,例如,像这样:
def printArgs(args: Array[String]): Unit = { for (arg <- args) println(arg) }
或这样:
def printArgs(args: Array[String]): Unit = { args.foreach(println) }
这个例子演示了减少使用var的一个好处。重构后(更函数式)的代码比原来(更指令式)的代码更简洁,明白,也更少机会犯错。Scala鼓励函数式风格的原因,实际上也就是因为函数式风格可以帮助你写出更易读懂,更不容易犯错的代码。
当然,你可以走得更远。重构后的printArgs方法并不是纯函数式的,因为它有副作用——本例中,其副作用是打印到标准输出流。函数有副作用的马脚就是结果类型为Unit。如果某个函数不返回任何有用的值,就是说其结果类型为Unit,那么那个函数***能让世界有点儿变化的办法就是通过某种副作用。更函数式的方式应该是定义对需打印的arg进行格式化的方法,但是仅返回格式化之后的字串,如代码3.9所示:
def formatArgs(args: Array[String]) = args.mkString("\n")
代码 3.9 没有副作用或var的函数
现在才是真正函数式风格的了:满眼看不到副作用或者var。能在任何可枚举的集合类型(包括数组,列表,集和映射)上调用的mkString方法,返回由每个数组元素调用toString产生结果组成的字串,以传入字串间隔。因此如果args包含了三个元素,"zero","one"和"two",formatArgs将返回"zero\none\ntwo"。当然,这个函数并不像printArgs方法那样实际打印输出,但可以简单地把它的结果传递给println来实现:
println(formatArgs(args))
每个有用的程序都可能有某种形式的副作用,因为否则就不可能对外部世界提供什么值。偏好于无副作用的方法可以鼓励你设计副作用代码最少化了的程序。这种方式的好处之一是可以有助于使你的程序更容易测试。举例来说,要测试本节之前给出三段printArgs方法的任一个,你将需要重定义println,捕获传递给它的输出,并确信这是你希望的。相反,你可以通过检查结果来测试formatArgs:
val res = formatArgs(Array("zero", "one", "two")) assert(res == "zero\none\ntwo")
Scala的assert方法检查传入的Boolean并且如果是假,抛出AssertionError。如果传入的Boolean是真,assert只是静静地返回。
虽如此说,不过请牢记在心:不管是var还是副作用都不是天生邪恶的。Scala不是强迫你用函数式风格编任何东西的纯函数式语言。它是一种指令式/函数式混合的语言。你或许发现在某些情况下指令式风格更符合你手中的问题,在这时候你不应该对使用它犹豫不决。
Scala程序员的平衡感
崇尚val,不可变对象和没有副作用的方法。
首先想到它们。只有在特定需要和判断之后才选择var,可变对象和有副作用的方法。
到此,关于“Scala的函数式风格是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!