Scala学习笔记(4)-函数式风格

识别指令式和函数式风格有一个小技巧就是,如果代码包含了任何var变量,那它大概就是指令式的风格。如果代码根本就没有var——就是说仅仅包含val——那它大概是函数式的风格。因此向函数式风格推进的一个方式,就是尝试不用任何var编程,Scala鼓励你使用val进行函数式编码。

先来看一个指令式风格的: 

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)
}

从上面的代码可以看到函数式风格的代码更简洁、更易读、更少犯错。

但是上面的printArgs并不是纯函数式的,因为它有副作用,其副作用是打印到标准输出流。函数有副作用的马脚就是结果类型为Unit。如果某个函数不返回任何有用的值,就是说其结果类型为Unit,那么那个函数唯一能让世界有点儿变化的办法就是通过某种副作用。

更函数式的风格应该是:

def formatArgs(args: Array[String]) = args.mkString("\n")//没有副作用,返回值打印交由println处理
println(formatArgs(args))//照上面所说println函数是有副作用的


牢记:不管是var还是副作用都不是天生邪恶的。Scala不是强迫你用函数式风格编任何东西的纯函数式语言。它是一种指令式/函数式混合的语言。你或许发现在某些情况下指令式风格更符合你手中的问题,在这时候你不应该对使用它犹豫不决。

崇尚val,不可变对象和没有副作用的方法,只有在特定需要和判断之后才选择var,可变对象和有副作用的方法。

你可能感兴趣的:(Scala学习笔记(4)-函数式风格)