千家信息网

Scala的函数式风格是怎样的

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要介绍"Scala的函数式风格是怎样的",在日常操作中,相信很多人在Scala的函数式风格是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Scala的函
千家信息网最后更新 2025年02月23日Scala的函数式风格是怎样的

这篇文章主要介绍"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的函数式风格是怎样的"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

函数 风格 副作用 方法 代码 指令 结果 学习 程序 类型 变量 就是 工具 有用 帮助 测试 输出 世界 例子 元素 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发南京雨花台区 岳阳市网络安全办公室主任 计算机网络技术网络层表格课件 基建网络安全管理局 数据库应用代码编写 软件开发 好的大学排名 数据库开发技术复习 网校数据库设计 怎样关闭数据库中的查询页面 目前主要软件开发平台 赤城大海陀服务器投诉电话 网络安全工程师建议读研 护苗网络安全系列课堂作文 流氓软件开发 软件开发未来的求职意向和打算 渭南市网络安全知识电视比赛 软件开发需求调研文档 软件开发包怎么使用 数据库技术及应用教程知识点 荆门万博网络技术学校网站 网络安全知识问答小学生 网络安全工程师需要条件 汽车应用层软件开发工程师薪资 三个着力推进网络安全综合治理 西安来意芙网络技术有限公司 屏幕共享软件开发一般哪家好 软件开发工程师月薪 query数据库不重复存储 中兴通讯协议软件开发 计算机网络技术 超星
0