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函数是有副作用的<span></span>

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

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

时间: 2024-10-10 19:54:36

Scala学习笔记(4)-函数式风格的相关文章

Scala学习笔记及与Java不同之处总结-从Java开发者角度

Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方.以下列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码演示样例及具体阐述见下文. ? Scala中可直接调用Java代码,与Java无缝连接. 语句能够不用";"结束.且推荐不适用";". 变量声明时以var或va

原创:Scala学习笔记(不断更新)

Scala是一种函数式语言和面向对象语言结合的新语言,本笔记中就零散记下学习scala的一些心得,主要侧重函数式编程方面. 1. 以递归为核心控制结构. 实现循环处理的方式有三种:goto,for/while,递归,其中用goto实现循环已经在现代语言中被放弃,而for/while形式的结构化编程成为主流,而递归作为另一种方案,则长期只流行在函数式编程的小圈子中. 递归被主流编程界所担心的主要是过深的调用栈,甚至以前的课堂上我们还亲自尝试过将递归改写为循环,但是现代函数式编程语言中,通过尾递归(

Scala学习笔记及与Java不同之处总结-从Java开发人员角度

Scala与Java具有许多相似之处,但又有许多不同.这里主要从一个Java开发人员的角度,总结在使用Scala的过程中所面临的一些思维转变.这里只是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方.下面列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码示例及详细阐述见下文. ? Scala中可直接调用Java代码,与Java无缝连接: 语句可以不用";"结束,且推荐不适用";": 变量声明时以var或val开头

Scala学习笔记一之基础语法,条件控制,循环控制,函数,数组,集合

前言:Scala的安装教程:http://www.cnblogs.com/biehongli/p/8065679.html 1:Scala之基础语法学习笔记: 1:声明val变量:可以使用val来声明变量,用来存放表达式的计算结果,但是常量声明后是无法改变它的值的,建议使用val来声明常量: 声明var变量:如果要声明可以改变的引用,可以使用var变量,声明的常量的值可以改变. 3:指定类型:无论声明val变量还是声明var变量.都可以手动指定其类型,如果不指定,scala会自动根据值,进行类型

Scala学习笔记:重要语法特性

1.变量声明 Scala 有两种变量, val 和 var  val的值声明后不可变,var可变 val msg: String = "Hello yet again, world!" 或者类型推断 val msg = "Hello, world!" 2.函数定义 如果函数仅由一个句子组成,你可以可选地不写大括号. def max2(x: Int, y: Int) = if (x > y) x else y 3.for循环 打印每一个命令行参数的方法是: ar

Scala学习笔记-环境搭建以及简单语法

关于环境的搭建,去官网下载JDK8和Scala的IDE就可以了,Scala的IDE是基于Eclipse的. 下面直接上代码: 这是项目目录: A是scala写的: package first import scala.collection.mutable.ListBuffer object A { def main(args: Array[String]) { print("Hello,Scala");//学习程序设计的第一句 println("---");//pr

Scala学习笔记(1) -- 为什么要学函数式编程

很久之前我就学过Lisp和Erlang,但是也就是写写HelloWorld,写个排序算法.也在Coursera上听过Scala的课,可是那时候我还不怎么用Java,所以后来也没怎么继续.可是对函数式编程的兴趣一直不减,工作中几乎不会用Scala,但是用的是Java,我一直在想着怎么把Scala用到工作中.最近在写一个工具,因为这个工具基本只有我们项目组用,而且很简单,所以我就用Scala写了.以后有机会,把Scala用在生产上. 为什么对函数式编程这么感兴趣呢. 第一个原因,可以装逼,或者说是个

Scala中链式调用风格的实现代码实战及其在Spark编程中的广泛运用之Scala学习笔记-41

package com.leegh.parameterization /** * @author Guohui Li *///由于breathe返回的是this,scala将返回类型推断为Animal,而由于Animal没有eat方法//class Animal { def breathe = this }//class Cat extends Animal { def eat = this } class Animal { def breathe: this.type = this }clas

scala学习笔记-函数式编程(14)

将函数赋值给变量 1 // Scala中的函数是一等公民,可以独立定义,独立存在,而且可以直接将函数作为值赋值给变量 2 // Scala的语法规定,将函数赋值给变量时,必须在函数后面加上空格和下划线 3 4 def sayHello(name: String) { println("Hello, " + name) } 5 val sayHelloFunc = sayHello _ 6 sayHelloFunc("leo") 匿名函数 1 // Scala中,函数