有趣的 Scala 语言:简洁的 Scala 语法( 二 )


让我们换个角度 , 尝试用递归的方式去思考这个问题 , 对一个数列的求和问题可以简化为该数列的第一个元素加上由后续元素组成的数列的和 , 依此类推 , 直到后续元素组成的数列为空返回 0 。 具体程序如下 , 使用递归 , 原来需要 9 行实现的程序现在只需要两行 , 而且程序逻辑看起来更清晰 , 更易懂 。
使用递归对数列求和:
//xs.head 返回列表里的头元素 , 即第一个元素
//xs.tail 返回除头元素外的剩余元素组成的列表
def sum1(xs: List[Int]): Int = if (xs.isEmpty) 0 else xs.head + sum1(xs.tail)
有没有更简便的方式呢?答案是肯定的 , 我们可以使用列表内置的一些方法达到同样的效果:
有趣的 Scala 语言:简洁的 Scala 语法文章插图
上述使用了规约操作 。
规约操作是对容器的元素进行两两运算 , 将其规约为一个值 。 最常见的规约方式使 reduce , 它接受一个二元函数 f 作为参数 , 首先将 f 作用在某两个元素上并返回一个值 , 然后再将 f 作用在上一个返回值和容器的下一个元素上 , 再返回一个值 , 依次类推 , 最后容器中的所有值会被规约为一个值 。
list map (_.toString) reduce((x,y)=>s"f($x,$y)")
有趣的 Scala 语言:简洁的 Scala 语法文章插图
上面这行代码:先通过 map 操作将List[Int] 转化成 List[String] , 也就是把列表中的每个元素从 Int 类型转换成 String 类型 , 然后对这个字符串进行自定义规约 , 语句的执行结果清楚地展示了 reduce的过程 。
事实上 , List 已经为我们提供了 sum 方法 , 在实际应用中 , 我们应该使用该方法 , 而不是自己定义一个 。 作者只是希望通过上述例子 , 让大家意识到 Scala 虽然提供了用于循环的 while 语句 , 但大多数情况下 , 我们有其他更简便的方式能够达到同样的效果 。
有趣的 Scala 语言:简洁的 Scala 语法文章插图
有趣的 Scala 语言:简洁的 Scala 语法文章插图
四、如何运行 Scala 程序?在运行方式上 , Scala 又一次体现出了它的灵活性 。 它可以被当作一种脚本语言执行 , 也可以像 Java 一样 , 作为应用程序执行 。
作为脚本执行:
我们可以将 Scala 表达式写在一个文件里 , 比如 Hello.scala 。 在命令行中直接输入 scala Hello.scala就可得到程序运行结果 。
Hello.scala 代码:
println("Hello Rickie!")
有趣的 Scala 语言:简洁的 Scala 语法文章插图
作为应用程序执行:
作为应用程序执行时 , 我们需要在一个单例对象中定义入口函数 main , 经过编译后就可以执行该应用程序了 。
object HelloRickie {
def main(args: Array[String]): Unit = {
println("Hello Rickie!")
}
}
有趣的 Scala 语言:简洁的 Scala 语法文章插图
Scala 还提供了一个更简便的方式 , 直接继承另一个对象 App , 无需定义 main方法 , 编译即可运行 。
有趣的 Scala 语言:简洁的 Scala 语法文章插图
五、结束语本文为大家介绍了 Scala 的基本语法 , 相比 Java , Scala 的语法更加简洁 , 比如 Scala 的类型推断可以省略程序中绝大多数的类型声明 , 短小精悍的匿名函数可以方便的在函数之间传递 , 还有各种在 Scala 社区约定俗成的习惯 , 比如省略的分号以及函数体只有一条表达式时的花括号 , 这一切都帮助程序员写出更简洁 , 更优雅的程序 。
有趣的 Scala 语言:简洁的 Scala 语法文章插图