一. 概览
scala : java语言的脚本化。
Scala 的类关系图
数据类型注意点
1、 Any 是所有类的父类,包括值类型 AnyVal,和引用类型 AnyRef
2、 AnyVal 是所有值类型的父类,包括 Int,Double,Boolean,Unit 等等
3、 AnyRef 是所有引用类型的父类,包括 Null
4、 Null 是所有引用类型的子类
5、 Nothing 是所有类的子类
6、 Unit 类型只有一个实例,是(),相当于 java 中的 void,没有任何的实质意义
7、 Null 也只有一个实例,是 null,相当于 java 中的 null,能赋值给任何引用类型变量,不
能赋值给值类型变量
方法的返回值:
- 如果没有显示定义返回值, 会返回 有可能返回 的 值 的共同类型(父类)
定义方法
定义函数
基本操作
1 | //变量 |
二. 循环
1 | // 普通循环 |
三. 定义函数
1 | // 方式1 |
四. 数组
1 | // 定长 |
五. Map 映射
1 | // 不可变 immutable |
六. 元组tuple, 最大Tuple22
1 | // 二元元祖 叫 对偶 |
七. OOP
1 | // 定义类 & 基本操作 |
八. 继承 inheritance
extends
1 | 继承/扩展 |
九. abstract , trait, file, apply, 操作符
1 |
|
十. 高阶函数
—> 函数 Function 和 方法 Method 的区别, 见这里
查看函数: 直接输入函数名
查看方法: 输入方法名之后, 按 tab 键提示, 也会展示方法
1 | 基本函数定义 |
十一. 柯里化
概念: 以逻辑学家 Haskell Brooks Curry 的名字命名
将原来接受2个参数的函数, 变成新的接受一个参数的函数的过程.
新的函数返回一个以原有第二个参数作为参数的函数
1 | → 原函数 |
与柯里化相关的知识点(方法向函数的转换)
1 | 1) 多个参数的方法可以转换为多元函数 |
十二. 控制抽象
1 | // 类似于 OC 中的 block, 此 block 无参数无返回值 :TODO 是控制 |
十三. 集合
List 集合
List 在添加元素时注意点,详细代码见下面:
- 使用
+:
或:=
添加单个元素时,:
必须靠着 list 一侧,+
必须靠着 单个元素 - 如果2边都是 list 集合, 必须用
++:
或者:::
或者++
- 不管是
+: , :+ , ++:
, 都不会改变原 list 的值 - 要添加的
元素 / list
在原 list 的哪边, 就添加到 list 的 那边
1 | //Nil (List空集合) |
Set 集合
注意:
- 不可变 Set 添加的是 元祖, 使用
+=
产生新集合, 自身无法改变, 可以赋值给新的常量 val - 可变 Set 也可以使用
+=
添加 元祖, 改变自身, 还可以使用++=
添加其他集合, 比如 List, Array, Range(1 to 10) 等…
1 | // Set 可变集合的操作(默认) |
其他的一些操作
1 | // 主要是 ArrayBuffer的 |
十四. 模式匹配 & 偏函数
1. 字符串匹配
1 | scala> val x = '9' |
2. 匹配类型,x类型定义成判断类型的共同超类。
1 | scala> val x:Any = "123" |
3. 匹配数组数据
1 | scala> val arr = Array(0,1,2) |
4. 偏函数
把模式匹配抽出来变成函数了
1 | ---定义 |
十五. 样例类
关键字 : case
主要用于模式匹配.
内置了apply和unapply方法,还有串行化等接口。
创建对象时不需要使用new.
1 | // 创建样例类 |
十六. 泛型
1. 泛型的定义 & 上下界
1 | // Java 中常用的泛型 |
2. 泛型的型变 :TODO 不懂
1 | Friend[+Dog] //协变, 如果 A是 B的子类, 那么ListA 也是 ListB 的子类 |
十七. 隐式转换 implicit
隐式转换函数:使用 **implicit** 修饰的具有一个参数的函数。
1 | // 定义隐式转换函数 |