**
- .Mixin–混编
当某个特质被用于组合类时,被称为混入;
Java:当一个类有接口的时候称为混入;
trait可以继承自类;
类实现接口在java中使用(implements),在scala中使用with;
一个类只能有一个父类但是可以有多个混入(分别使用关键字extend和with)
混入和某个父类可能有相同的父类
-
高阶函数
-高阶函数是指使用其他函数作为参数、或者返回一个函数作为结果的函数。在Scala中函数是“一等公民”,所以允许定义高阶函数。这里的术语可能有点让人困惑,我们约定,使用函数值作为参数,或者返回值为函数值的“函数”和“方法”,均称之为“高阶函数”。
方法的参数和返回值在java中是一个类型(基本数据类型和引用类型),类型可以再增加一个方法;如果java支持此语法,那scala就木有必要学
方法的参数和返回值可以是方法;
使用高阶函数的一个原因是减少冗余的代码
返回函数的函数:方法的返回值也是函数; -
柯里化–多参数列表
方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化。 -
案例类
案例类非常适合用于不可变的数据
不能使用new来创建对象,这是因为案例类有一个默认的apply方法来负责对象的创建。
使用==比较,可以直接比较堆和栈的上的值
当你创建包含参数的案例类时,这些参数是公开(public)的val,不能为案例类的属性重新赋值
拷贝:浅拷贝,只拷贝类的属性中(基本数据类型);深拷贝(不但拷贝基本数据类型还要拷贝引用数据类型)
密封类:
特质(trait)和类(class)可以用sealed标记为密封的,这意味着其所有子类都必须与之定义在相同文件中,从而保证所有子类型都是已知的。 -
提取器对象
提取器对象是一个包含有 unapply 方法的单例对象。apply 方法就像一个构造器,接受参数然后创建一个实例对象,反之 unapply 方法接受一个实例对象然后返回最初创建它所用的参数。提取器常用在模式匹配和偏函数中。
unapply 方法的返回值应当符合下面的某一条:
如果只是用来判断真假,可以返回一个 Boolean 类型的值。例如 case even()。
如果只是用来提取单个 T 类型的值,可以返回 Option[T]。(Option===java中的枚举)
如果你想要提取多个值,类型分别为 T1,…,Tn,可以把它们放在一个可选的元组中 Option[(T1,…,Tn)]。
有时,要提取的值的数量不是固定的,因此我们想根据输入来返回随机数量的值。这种情况下,你可以用 unapplySeq 方法来定义提取器,此方法返回 Option[Seq[T]]。常见的例子有,用 case List(x, y, z) => 来解构一个列表 List,以及用一个正则表达式 Regex 来分解一个字符串 String,例如 case r(name, remainingFields @ _*) =>。 -
.For—yield
Scala 提供一个轻量级的标记方式用来表示 序列推导。推导使用形式为 for (enumerators) yield e 的 for 表达式,此处 enumerators 指一组以分号分隔的枚举器。一个 enumerator 要么是一个产生新变量的生成器,要么是一个过滤器。for 表达式在枚举器产生的每一次绑定中都会计算 e 值,并在循环结束后返回这些值组成的序列。
- 泛型
在java中定义的时候使用的<>, 这里面的字母随便写,一般是一个字母,
泛型类指可以接受类型参数的类。泛型类在集合类中被广泛使用。使用的是[ ]
一个惯例是使用字母 A 作为参数标识符,当然你可以使用任何参数名称。
型变:
[+A]:协变;在定义的时候使用的是+a,在使用的时候定义的是一个父类,验证的时候传入子类也木有问题;
[-A]:逆变:在定义的时候使用的是-a,在使用的时候定义的是一个子类,验证的时候传入父类也木有问题;
[A]:不变;