文档章节

scala学习笔记

小小的长大
 小小的长大
发布于 2017/01/02 21:05
字数 1013
阅读 29
收藏 2

函数式编程的特点

  1. 函数是一等公民 即first class,函数与其他数据类型一样,处于平等地位,可以赋值给其他变量;作为参数传入函数中;作为函数返回值。
  2. 只用表达式,不用语句 表达式expression是一个有返回值的运算过程,而语句statement是执行操作,没有返回值。函数式编程要求,只使用表达式,而不用语句,即运算且要有返回值。 语句属于系统的读写I/O操作(没有懂?),而在实际应用中,不可能没有I/O操作,因此不要有不必要的读写操作,进而保持计算过程的单纯性。
  3. 没有副作用 Side effect,函数内部与外部互动(如:修改全局变量的值),产生运算以外的其他结果。函数式编程强调没有副作用,即函数要保持独立,所有功能就是返回一个值,没有其他行为,尤其是不得修改外部变量的值。
  4. 不修改状态 函数式编程只返回值,不修改系统变量,即状态不能保存在变量中。函数式编程使用参数保存状态,如递归,由于使用了递归,函数式语言的运行速度较慢,也是长期不能在业界推广的主要原因。
  5. 引用透明 Referential transparency,函数的运行不依赖于外部变量或状态,只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值就总是相同的。

其他类型的语言:函数的返回值可能与系统状态有关,在不同状态下,返回值可能不一样。这叫“引用不透明”,不利于观察和理解程序的行为。

函数式编程的价值

  1. 代码简洁,开发快速 使用函数,减少重复代码,程序较短,开发速度较快。
  2. 接近自然语言,易于理解 自由度高,可以写出很接近自然语言的代码。如:
// 以下所有函数均需要自己实现
// (1+2)*3-4
subtract(multiply(add(1,2),3),4)
add(1,2).multiply(3).subtract(4)
// 易懂的代码示例
merge([1,2],[3,4]).sort().search("2")
  1. 方便代码管理 函数式编程不依赖、也不改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看作独立单元,利于单元测试unit testing和排错debugging,以及模块化组合。
  2. 易于并发编程 不需要考虑死锁deadlock,因此函数式编程不修改变量,不存在锁线程的问题,不必担心一个线程的数据,被另一个线程修改,所以可以很放心把工作分摊到多个线程,部署并发编程concurrency。
// s1和s2互不干扰,不会修改变量,无所谓执行顺序,可以分配到两个线程上完成
var s1 = Op1()
var s2 = Op2()
var s3 = concat(s1, s2)
  1. 代码热升级 只要保证接口不变,内部实现就与外部无关,所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。

基础语法

函数定义

// 函数定义
def 函数名(变量名:变量类型):函数返回值类型={函数体}
// 当函数是递归的,那么必须明确说明函数返回值类型;在非递归函数中,编辑器可以推断函数返回值类型。
// 默认的函数返回值类型为Unit,Unit指的是函数没有有效的返回值,类似于Java的void。因此结果类型是Unit的方法,并非为了得到返回值,而是为了其他的运行效果。

值函数与匿名函数

闭包

闭包=代码+用到的非局部变量

© 著作权归作者所有

小小的长大
粉丝 15
博文 38
码字总数 27023
作品 0
娄底
私信 提问

暂无文章

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
42分钟前
85
5
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
2
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部