scala入门
1. 基础语法
- 标识符区分大小写
- class 名称首字母需大写
- 方法名称首字母需小写
- 程序文件名称需与 object 名称相同
- main 方法是 Scala 程序的入口,每个 Scala 程序都必须定义此方法。
- 标识符
在 Scala 中标识符只能包括字符、数字和下划线,并且只能以字符和下划线开头,如:name、_value、test_1等等。 - 混合标识符
混合标识符由一个字符数字标识符、下划线和一个运算标识符组成,比如:unary_+、var_=。在这里,unary_+定义了一个一元+运算符,myvar_=用来作为方法名称定义了一个赋值运算符。 - 文字标识符
用``符号包含任意字符都是文字标识符
2. 数据类型
类型与java相同,占用的内存空间和精度也都一样
但是目测在java里面是没有这些的
类型 | 描述 |
---|---|
Unit | 表示没有值 |
Null | 空或空引用 |
Nothing | 每一个其他类型的子类型,包括无值 |
Any | 任何类型的超类型,任何 object 都是 Any 类型的 |
AnyRef | 任何引用类型的超类型 |
- 变量和常量
var声明变量,使用val声明值(也就是常量)
3. 函数定义和使用
一般定义
函数通过def定义,在 Scala 中,需要为函数参数指定类型签名,具体的格式如下
def functionName ([list of parameters]) : [return type] = {
function body
return [expr]
}
无参函数
如果函数不带参数,调用的时候可以不写括号,函数体中的语句如果只有一条表达式,可以省略函数的大括号
记录一下操作过程
- 函数的部分应用
这是用下划线来实现的,是一个和以往学过的语言很不一样的一个特点
你可以使用下划线_部分应用一个函数,结果将得到另一个函数。Scala使用下划线表示不同上下文中的不同事物,你通常可以把它看作是一个没有命名的神奇通配符。在{ _ + 2 }的上下文中,它代表一个匿名参数。你可以部分应用参数列表中的任意参数,而不仅仅是最后一个。你可以这样使用它
def add(x: Int, y: Int) :Int = {
return x + y
}
var add1 = add(1, _:Int)
var add2 = add1(2)
println(add2)
效果是这样的,第一次调用add的时候后面那个参数用下划线来替代掉了
柯西化函数
现在我理解这个就是说这个有多个括号,每个括号里面是一个参数和其类型注解
可变长度参数
同一个类型的函数参数,个数是可变的,至少一个
这个例子是把输入的单词变成大写
// 把所有单词改为首字母大写
def capitalizeAll(args: String*) = {
args.map { arg =>
arg.capitalize
}
}
var str = capitalizeAll("hello", "world")
println(str)
4. 类
在类中用def定义方法用val定义字段值
类的构造方法
这个课里面讲的构造函数,应该就是在实例化对象的时候给类方法传递参数,和java不一样的是类体里面不需要指明一个名字是类名的方法
这是一个展示scala“面向表达式”的例子,对color的blue、black、white的赋值都是绑定在表达式上面的
class Calculator(brand: String) {
/**
* 一个构造函数
*/
val color: String = if (brand == "shiyanlou") {
"blue"
} else if (brand == "hello") {
"black"
} else {
"white"
}
// 实例方法
def add(m: Int, n: Int): Int = m + n
}
类的继承
继承的关键字和java一样也是extends但是后面接的父类名字后面是带括号的
方法重载
上面那个科学计算器类,里面的log方法,在下面的这个例子里面被重载
试了原来的color属性,双参数的log方法,以及新的重载的那个方法
抽象类的继承
5. 特质
特质(Traits)是一些字段和行为的集合,可以扩展或混入(mixin)你的类中。不同于类继承,class 可以扩展多个 Traits。
通过 with 关键字,一个类可以扩展多个特质
但是让一个类拥有特质的办法还是extends,只不过extends后面可以加多个特质
几个特质之间要用with来连接
6. 集合
Scala 提供了丰富的集合库,包括:列表(List)、集合(Set)、映射(Map)、选项(Option)、元组(Tuple)
set和list的话,最直观的结果是这样的
而immutable的意思是永恒不变的,但是并不能帮助我在字面意思上理解set和list的不同,还是等具体实践操作吧
map映射的话,是这样用的
用括号括起来就是元组,不禁让人联想起来数据库里面关系模式什么的
选项option的话我理解这个字面是什么意思,但是没有搞清楚这个操作是在干什么
查了人家的博客,好像是说,Scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。
在没有值的时候,使用None,这是Option的一个子类。如果有值可以引用,就使用Some来包含这个值。
Some也是Option的子类
Option类型的值通常作为Scala集合类型(List,Map等)操作的返回类型。比如Map的get方法。Option有两个子类别,Some和None。当程序回传Some的时候,代表这个函式成功地给了你一个String,而你可以透过get()函数拿到那个String,如果程序返回的是None,则代表没有字符串可以给你