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

或这样:spa

def printArgs(args: Array[String]): Unit = { 
    args.foreach(println)
}

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

可是上面的printArgs并非纯函数式的,由于它有反作用,其反作用是打印到标准输出流。函数有反作用的马脚就是结果类型为Unit。若是某个函数不返回任何有用的值,就是说其结果类型为Unit,那么那个函数惟一能让世界有点儿变化的办法就是经过某种反作用。code

更函数式的风格应该是:orm

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

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

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

相关文章
相关标签/搜索