常量与变量的定义
//定义一个变量
var number=1;
//定义一个常量
val number=1;
单例对象与伴生对象
- scala没有静态方法或者静态字段,你可以用object这个语法结构来达到同样的目的。
- 在Java或者C++中,你通常会用到既有实例方法又有静态方法的类。在scala中可以通过类和类同名的伴生对象来达到相同的目的,可以用class这个语法结构
柯里化
柯里化指的是方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化。
举个例子,原来接收两个参数的函数变成新的接收一个参数的函数过程。新的函数返回一个以原有第二个参数作为参数的函数。
def add(x:Int,y:Int)=x+y
add(1,2)
def add(x:Int)(y:Int)=x+y
add(1)(2)
这两个结果都是3,但是第二种方式就叫做柯里化。
实现过程
def add(x:Int)=(y:Int)=x+y
val result=add(1)
该方法定义了一个参数为x,返回为一个匿名函数:(y:Int)=>1+y
此时
val sum=result(2)
即sum=1+2结果是3
闭包
闭包是指一个函数,返回值依赖于声明在函数外部的一个或多个变量。
例子:
val factor=3
val mutiplier=(i:Int)=>i*factor
这个例子中factor不是形参而是自由变量。
主构造器
在类的主构造器中,需要给字段显式增加val或者var字段,我们才能访问该字段,如果不增加限定词,该字段无法通过scala提供的方法访问
class Person(name:String,age:Int) {
}
class Person(var name:String,val age:Int){
}
如上面两个代码片段,第二个片段可以访问name与age,而第一段不能访问name与age
Option(选项)
大多数语言都有一哥特殊的关键字无,java里面这个叫做null。在java里null是个关键字而不是一个对象,所以对他调用任何方法都是
非法的,但是为什么要在程序员希望返回一个对象的时候返回一个关键字呢?
为了让所有的东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。在没有值的时候,使用None,他是Option的一个子类;在有值的时候用Some来包含这个值,它也是Option的一个子类。
好处
Option可以当成是一个集合来看待,集合的大小是1或者0,所以可以把map,filter,foreach等操作用在Option上。这样可以避免判空。
使用模式匹配可以达到避免使用if的效果。