Scala学习笔记一Scala与函数式编程
**
摘要:
**
去年开发的过程中使用过Kafka,了解到Kafka是用Scala编写的,今年在开发过程中,使用了spark,spark也是使用Scala编写的,并且在项目中使用了Scala开发,只是对Scala缺乏一个系统的学习,所以花了一个多月的时间看完了《快学Scala》,看完之后本来想写点摘要笔记,过程当中顺带看了慕课网Scala程序设计—基础篇,发现慕课网的基础讲解挺不错的,所以就把慕课网的讲解结合了个人的理解记录下来,慕课网的基础篇确实讲解的是基础,建议大家看抽空看一下《快学Scala》,书本把原理的东西,以及Scala的很多概念讲解得更加详细
**
一.什么是Scala
**
来自scalable可伸缩的,可伸缩编程语言,纯正的面向对象语言,函数式编程语言,无缝的Java互操作语言,
Scala之父 Martin Odersky
**
二.函数式变成是什么鬼?
**
只用纯函数来编写程序
纯函数(pure function) ,或函数的纯粹性(purity),没有副作用(Side Effect)
副作用是状态的变化(mutation)
例子:修改全局变量,抛出异常,IO读写,调用有副作用的函数
副作用:
var x=1
def function1(y:Int) = x+y
def function2(y:Int) = {x+=y;x}
这里全局变量x在function1调用后不改变数值,function2中调用后改变数值,所以说function1对x没有副作用,function2有副作用。
引用透明(Referential Transparency)对于相同的输入,总是得到相同输出, 如果f(x)的参数x和函数体都是引用透明的,那么函数f是纯函数
例子:违反引用透明
var x=new StringBuilder(“Hello”)
x:StringBuilder=Hello
var y=x.append(" World!")
y:Stringbuilder= Hello World!
var z=x.append(“World!”)
z:StringBuilder = Hello World!World!
函数体append返回的值不同,违反引用透明
怎么确保引用透明:不变性(Immutability) 为了获得引用透明性,任何值都不能变化
函数式编程重要概念:
函数是一等公民(First-class Function)
一切都是计算,函数式编程中只有表达式,变量、函数都是表达式
高阶函数(Higher order Function)
闭包(Closure)
表达式求值策略:严格求值 和非严格求值 Call By Value vs Call By Name
惰性求值(Lazy Evaluation) 递归函数(Recursive Function) 递归实现循环
尾递归(Tail Recursion)
函数式编程优点:
生产效率高,同样的程序,Lisp代码的长度可能是C代码的1/7 到1/10
易于推理(Reasoning)
并行编程 多核计算、云计算
函数式编程的崛起:
摩尔定律的失效 多核处理器 云计算时代
**
三.scala环境搭建 省略,,,网上教程多,搭建简单
**
涉及概念: jdk 安装 ,Scala 安装 ,命令行通过输入scala启动Scala,
Scala ide安装,Scala ide 创建Scala代码 ,Scala编译Scala文件,
SBT Simple Build Tool Scala编译工具通过sbt console启动Scala,
REPL Read Evaluate Print Loop交互式程序运行环境,
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
- Scala学习笔记 --- 理解术语面向对象编程和函数式编程
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
- Scala学习笔记 - 快学scala第九章
- scala学习笔记2(类,继承,抽象类)
- Scala学习笔记
- Scala学习笔记-方法和函数
- Scala学习笔记(2)——一口气讲完用Itellij(Maven)建工程并打包的事情
- maven学习笔记:使用eclipse的maven插件创建scala_spark项目
- Scala学习笔记--特质trait
- scala学习笔记一(基础,安装及数据类型)
- Scala学习笔记(3)
- Scala学习笔记
- Scala学习笔记--Constructor
- Scala学习笔记3--类型推演
- Set、Map、TreeSet、TreeMap操作代码实战之Scala学习笔记-31
- Scala学习笔记-类
- Scala学习笔记(4):关于String
- [Scala]Scala学习笔记九 提取器
- Scala学习笔记09--隐式转化implicit