scala
预备知识
- 命令式编程 和 函数式编程
- 函数式编程关心类型(代数结构)之间的关系
- 命令式编程关心解决问题的步骤
- 我们刚开始入门学习的都是命令式编程,其精髓,用指令告诉机器要怎样做,更像是我们为计算机制造一个流水线,机器按照指令顺序执行
- 函数式编程,其精髓,是在使用表达式(计算)来表达程序,但大多数时候还是会化成指令进项行的
- 所谓的编程范式只是程序员看待程序的看法。
scala 特性
- 语言特性
- 运行在jvm上,因此理所因当的,编写完,会编译成java 的 class 。由于这种特性,scala天生就可以使用所有的java包。
- 具有类型推断的静态类型语言。
var a = 1 var a = "123" //报错的啦,愚蠢的人类
- 面向对象 + 函数式编程的 多范式语言。
- 拥有解释器。
- 部分应用(偏应用函数)
- 使用神奇的通配符“_” 替换函数中的参数,可以得到另一个函数
def adder(m: Int, n: Int) = m + n val add2 = adder(2, _:Int) //使用通配符得到一个新函数 add2(3)
- 柯里化函数
- 将一个多参函数 柯里化后,变为每次都只接受一个参数并且返回一个新的接收剩余参数的函数
def multiply(m: Int)(n: Int): Int = m * n val timesTwo = multiply(2) _
- 将一个多参函数 柯里化后,变为每次都只接受一个参数并且返回一个新的接收剩余参数的函数
- 可变参数
* 都9102年了,这就不用讲了吧 - 类: 构造函数
- 构造函数不是特殊的方法,他们是除了类的方法定义之外的代码;
Calculator(brand: String) { /** * A constructor. */ val color: String = if (brand == "TI") { "blue" } else if (brand == "HP") { "black" } else { "white" } // An instance method. def add(m: Int, n: Int): Int = m + n }
- 构造函数不是特殊的方法,他们是除了类的方法定义之外的代码;
- 特质(Traits)
- 字段和行为的集合;可以扩展和混入你的类中。可以当做java中的接口,通过组合灵活的实现新功能的切入
trait Car { val brand: String } trait Shiny { val shineRefraction: Int } class BMW extends Car with Shiny { val brand = "BMW" val shineRefraction = 12 }
- 字段和行为的集合;可以扩展和混入你的类中。可以当做java中的接口,通过组合灵活的实现新功能的切入
- apply 方法
- 可以认为是当使用类名作为函数时,调用的实际函数
object Greeting{ def apply(name: String) = "Hello " + name } Greeting("colin") 实际就是在调用apply
- 可以认为是当使用类名作为函数时,调用的实际函数
- 单例对象
- scala中没有静态变量,通过定义一个单例对象来获得想要的功能
- 非伴生的单例对象,不与任何类有关联,可以定义很多方法,作为工具类,或者作为程序入口
- 伴生对象,与伴生类同名,需要定义在同一文件,可以与伴生类互相访问私有成员。
- 函数即对象
- 或者说 对象即函数,实际上是指 一个对象,通过继承Functionl 特质,继承了apply方法,使得我们可以通过objectName()调用对象中apply(),看起来就像是函数了。
- 模式匹配和样本类
- 模式匹配,可以初步的认为是switch case。
- 样本类是用来方便储存和匹配类的内容的。
- 集合的连接操作符
- List:"::",":::"
1 :: 2 :: 3 :: Nil, var fruit = fruit1 ::: fruit2
- Set:"++"
val fruit1 = Set("apples", "oranges", "pears") val fruit2 = Set("mangoes", "banana") var fruit = fruit1 ++ fruit2
- Map: "+","++"
A + = ('I' -> 1) val colors1 = Map("red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F") val colors2 = Map("blue" -> "#0033FF", "yellow" -> "#FFFF00", "red" -> "#FF0000") var colors = colors1 ++ colors2
- PS: +: 在头部添加,:+ 在尾部添加
- List:"::",":::"