Scala扩展部分
类型参数
Scala的类型参数与Java的泛型是一样的,可以在集合、类、函数中定义类型参数,从而保证程序更好的健壮性。
泛型类
泛型类,顾名思义,其实就是在类的声明中定义一些泛型类型,然后在类内部的字段或者方法,就可以使用这些泛型类型。
使用泛型类,通常是需要对类中的某些成员,比如某些字段和方法中的参数或变量进行统一的类型限制,这样可以保证程序更好的健壮性和稳定性。
如果不使用泛型进行统一的类型限制,那么在后期程序运行过程中难免会出现问题,比如传入了不希望的类型导致程序出问题。
在使用泛型类的时候,比如创建泛型类的对象,只需将类型参数替换为实际的类型即可。
Scala自动推断泛型类型特性:直接 ...
Scala隐式机制
隐式转换
隐式转换和隐式参数是Scala中两个非常强大的功能,利用隐式转换和隐式参数,可以提供类库,对类库的使用者隐匿掉具体的细节。
Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另外一种类型的对象并返回,这就是“隐式转换”。
首先得有一个隐式转换函数
使用到隐式转换函数接收的参数类型定义的对象
Scala自动传入隐式转换函数,并完成对象的类型转换
隐式转换需要使用implicit关键字。
使用Scala的隐式转换有一定的限制:
implicit关键字只能用来修饰方法、变量、参数
隐式转换的函 ...
Scala集合
可变和不可变集合
根据容器中元素的组织方式和操作方式,可以分为有序和无序、可变和不可变等不同的容器类别;
不可变集合是指集合内的元素一旦初始化完成就不可再进行更改,任何对集合的改变都将生成一个新的集合;
可变集合提供了改变集合内元素的方法;
Scala同时支持可变集合和不可变集合,主要下面两个包:
scala.collection.mutable:定义了可变集合的特质和具体实现类
scala.collection.immutable:定义了不可变集合的特质和具体实现类
对于几乎所有的集合类,Scala都同时提供了可变和不可变的版本。
Scala优先采用不可变集合,不可变集合元素不可 ...
Scala函数及抽象化
函数字面量及函数的定义
Scala中函数为头等公民,不仅可以定义一个函数然后调用它,还可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量。
函数字面量体现了函数式编程的核心理念。字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、符号字面量、函数字面量等。什么是函数字面量呢?
在函数式编程中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作。函数的使用方式和其他数据类型的使用方式完全一致,可以像定义变量那样去定义一个函数,函数也会和其他变量一样,有类型有值;
就像变量的“类型”和“值”是分开的两个概念一样,函数的“类型”和“值 ...
Scala模式匹配和样例类
模式匹配
Scala没有Java中的switch case,它有一个更加强大的模式匹配机制,可以应用到很多场合。
Scala的模式匹配可以匹配各种情况,比如变量的类型、集合的元素、有值或无值。
模式匹配的基本语法结构:变量 match { case 值 => 代码 }
模式匹配match case中,只要有一个case分支满足并处理了,就不会继续判断下一个case分支了,不需要使用break语句。这点与Java不同,Java的switch case需要用break阻止。如果值为下划线,则代表不满足以上所有情况的时候如何处理。
模式匹配match case最基本的应用,就是对变量的值进行模 ...
Scala特质
作为接口使用的特质
Scala中的trait特质是一种特殊的概念。
首先可以将trait作为接口来使用,此时的trait就与Java中的接口非常类似。
在trait中可以定义抽象方法,与抽象类中的抽象方法一样,只要不给出方法的具体实现即可。
类可以使用extends关键字继承trait。
注意:在Scala中没有implement的概念,无论继承类还是trait特质,统一都是extends。
类继承trait特质后,必须实现其中的抽象方法,实现时可以省略override关键字。
Scala不支持对类进行多继承,但是支持多重继承trait特质,使用with关键字即可。
12345678910 ...
Scala继承
继承的概念
Scala中继承类的方式和Java一样,也是使用extends关键字:
123class Employee extends Person{ var salary=1000}
和Java一样,可在定义中给出子类需要而父类没有的字段和方法,或者重写父类的方法。
1234567891011121314151617package lagou.cn.part05class Person(name: String, age: Int){ println("这是父类Person!")}class Student(name: ...
Scala类与对象
类和无参构造器
在Scala中,类并不用声明为public;
Scala源文件中可以包含多个类,所有这些类都具有公有可见性;
val修饰的变量(常量),值不能改变,只提供getter方法,没有setter方法;
var修饰的变量,值可以改变,对外提供getter、setter方法;
如果没有定义构造器,类会有一个默认的无参构造器;
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263package lagou. ...
Scala数组和元组
数组定义
数组几乎是所有语言中最基础的数据结构。数组可索引、类型一致、长度不变。
在Scala中,数组分为定长数组和变长数组。
定长数组,Array,长度是不变的
变长数组,ArrayBuffer,长度是可变的,它等效于Java中的ArrayList
变的数组类型,使用可变数组类型时需要显示声明;
使用ArrayBuffer时,需要导包 import scala.collection.mutable.ArrayBuffer;
Scala 中很多数组类型都有可变、不可变两个版本,推荐使用不可
12345678910111213141516171819202122232425262 ...
Scala控制结构和函数
if 表达式
Scala中 if 表达式有返回值。
如果if 和 else 的返回值类型不一样,那么就返回两个返回值类型公共的父类。
123456789101112131415161718192021222324252627282930object IfDemo { def main(args: Array[String]): Unit = { //在Scala中不需要添加分号作为语句块的结束符 val num = 20 //在Scala中 if else语句是有返回值的,返回值就是最后一条语句的返回值 if (num > 20) &qu ...