(一)Scala基础语法
1、Scala变量
三种变量修饰符:val(常量,一旦赋值不可再更改)、var(变量,可更改)、lazy val(惰性求值的常量,当定义的值可能不会被使用时可用该修饰符)。
可以注意到每行语句后可不加分号。。。。
2、Scala类型体系
3、控制结构和函数
3.1、条件表达式
3.2、块表达式
{}块包含一系列表达式,其结果也是一个表达式,块最后一个表达式的是就是块的值。
3.3、while循环、for循环
3.4、try表达式
3.5、函数
函数默认参数和带名参数
可变长参数
(二)Scala面向对象
1、类的定义和使用
2、构造器的使用
除主构造器之外,类允许多个辅助构造器,它的名称为this,
3、继承和重写
4、抽象类的使用
Scala抽象类不能被实例化,包含若干定义不完全的方法,具体的实现由子类去实现。重写抽象方法时,不需要使用abstract关键字,override可省略,若类存在抽象方法时,该类必须声明为abstract。
5、伴生类和伴生对象
- 在Scala中没有静态修饰符,单例对象的成员全部都是静态的
- 单例对象与类同名时,这个单例对象被称为这个类的伴生对象,而这个类被称为这个单例对象的伴生类。
- 伴生类和伴生对象要在同一个源文件中定义,伴生对象和伴生类可以互相访问其私有成员。
- 不与伴生类同名的单例对象称为孤立对象。
- 伴生对象方便伴生类的构建,可做为当前类的静态方法、成员的集合。
6、apply方法的使用
6.1、当快捷方式使用
所以当调用一个Object的时候,其实就是相当于调用了这个Object的apply方法。比如Array对象定义了apply方法,所以可以通过Array(2,4,6)创建数组,而不需new。
6.2、scala会自动为case class生成apply方法
6.3、在class中的apply
7、case class的使用
当一个类被生成为case class 时,scala会默认作如下工作:
- 如果参数不加var/val修改,默认为val
- 自动创建伴生对象,实现apply方法,方便了我们在创建对象时不使用new
- 实现自己的toString、hashCode、copy和equals方法
8、trait特征的使用
Trait(特征) 相当于 Java 的接口,Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承,使用with关键字即可
(三)Scala集合
1、数组
1.1、定长数组
1.2、变长数组:数组缓冲
1.3、遍历数组
1.4、数组转换
1.5、常用函数
2、Map映射
2.1、构造映射
2.2、获取映射中的值
2.3、更新映射中的值
2.4、迭代映射
3、Option、Some及None
Option可以存储任意类型的值,它有两个子类:Some和None。当程序回传Some的时候,代表这个函式成功地给了你一个值,而你可以透过get()函数拿到那个值,如果程序返回的是None,则代表没有值可以给你。
Option存在的意义,:就是为了在代码中注明, 让人一看就知道:"这个东西有可能是空的!你们用的时候给我小心点" 。 有了这个暗示, 你可就不能随意取出option里面的东西了, 警醒你每次使用, 都要先判断. isEmpty 或是 nonEmpty
4、Tuple(元组)的使用
- tuple最多支持22个元素
- Tuple 不能通过一个泛型参数来指定所有元素的类型,如Tuple3[Int](1,2,3)
5、List列表
构造List的两个基本单位是 Nil 和 ::,List一旦创建,已有元素的值不能改变,可以使用添加元素或删除元素生成一个新的集合返回。
List的三个基本操作:head
返回列表第一个元素、tail
返回一个列表,包含除了第一元素之外的其他元素、isEmpty
在列表为空时返回true。
::和:::操作符——::把一个新元素组合到已有元素的最前端,然后返回结果List;:::用于连接两个List
(四)Scala模式匹配(match case)
1、基本数据匹配及if防卫
2、变量模式
匹配的表达式会被赋值给那个变量
3、类型匹配
4、匹配数组、列表
5、case class模式匹配
Option通常会用于模式匹配中,用于判断某个变量是有值还是没有值,这比null来的更加简洁明了
6、Some和None模式匹配
(五)Scala高阶函数
scala支持:
- 把函数作为实参传递给另一个参数
- 把函数作为返回值
- 把函数赋值给变量
- 把函数储存在数据结构里
1、匿名函数
=> 匿名函数,表示创建一个函数实例,只需要说明输入参数的类型和函数体即可,不需要名称
2、带函数参数的函数
3、柯里化currying
柯里化是把接收多个参数的函数变成接收一个单一参数的函数,并返回接收余下参数且返回结果的新函数的技术
(六)Scala隐式转换
1、隐式转换函数
隐式转换函数的函数名可以是任意的,与函数名称无关,只与函数签名(函数参数和返回值类型)有关。
如果当前作用域中存在函数签名相同但函数名称不同的两个隐式转换函数,则在进行隐式转换时会报错
例子:将整数转换成字符串类型
2、隐式类
隐式类的主构造函数参数有且仅有一个!之所以只能有一个参数,是因为隐式转换是将一种类型转换为另外一种类型,源类型与目标类型是一一对应的
例子:string中没有bark方法,通过隐式转换,调用对应的方法转换
3、隐式对象
4、隐式参数与隐式值
举例一:修改上面一个方法--
举例二: