文档章节

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

李白吃白菜
 李白吃白菜
发布于 2015/08/14 12:44
字数 530
阅读 39
收藏 1

识别指令式和函数式风格有一个小技巧就是,如果代码包含了任何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,可变对象和有副作用的方法。


本文转载自:http://my.oschina.net/shajin/blog/156775

李白吃白菜
粉丝 12
博文 33
码字总数 18863
作品 0
朝阳
私信 提问

暂无文章

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部