2.1 操作符运算
- 使用中缀数学操作符+、-、*、/、%并产生对应的数值结果
- 使用比较操作符<、>、>=、=<并产生布尔值结果
- 使用逻辑操作符&&、||并产生布尔值结果
- 使用对等操作符==、!=并产生布尔值结果
- 使用位操作符&、|、^、~并产生数值结果
- 实际上,ScaLa没有任何操作符,所有的操作符运算都是对方法(函数)的调用
- 如1+2实际上是调用了.+() 这个方法1.+(2)
- 在具体的调用中,调用+实际上包含了+的各种类型参数的重载,而无需额外定义
- 前缀后缀操作符是一元操作符,而中缀操作符是二元操作符
- 操作符具有优先级
- 1+5*4=21 (1+5)*4=24
- 操作符优先级一般如下:
- 特殊字符 > */% > ± > : > =!> <> > & > ^ > | > 其他字母 > 赋值操作符
- scala支持如“***”“±+”之类的操作符重载,考虑其优先级一般以第一个符号为主
- 值得注意的是,形如“*=”的操作符重载,会被认为是赋值操作符而具有最低的优先级 即 m *= n+5 等价于m *= (n+5)
2.2 通用规范
2.2.1 标识符与命名
- 首字符为字母,后续字符任意字母和数字,可后接下划线_
- 首字符为操作符,后续字符为任意操作符
- Scala中有些保留字,不能用作标识符,但是反引号括起除外
- 如return是保留字,标志为Do.return是非法的,但可以标志为Do.
return
- 具体保留字一般可以通过查询保留字表得出,往往是常用的有特定含义的单词,如case、else等
2.2.2 语句结束
- Scala是基于行的语言,分号和换行均可作为语句的结束
- 判定换行是否为语句的结束有以下规则:
- 换行前的符号是一个语句的结束:常量、标识符、保留字及其他分隔符
- 换行后的符号是一个语句的开始:除部分分隔符及保留字外的所有符号
- 符号处在一个允许多语句的区域:Scala源文件中,匹配的{与}间
- 换行不作为语句的结束
- 匹配的(与)之间,[与]之间
- XML模式下的区域
- case符号及匹配的=>符号之间
- if、while、for、type是允许跨两行的合法语句
2.2.3 编程规范
- Scala是一门相当自由的语言,合法的语句却不一定好读、便于理解
- 通常的Scala编写规范
- 代码格式化,不同段落、不同文件的Scala应保持相同的语法格式
- 层次间缩进,避免长语句
- 合理的命名
- 短作用域短名字,长作用域长名字
- 通用缩写,词意与目的相近,莫要使用add来命名一个做减法的函数
- 避免不同用途时重用名字
- 避免用反引号声明保留字
- 有返回值的方法(函数)用可描述的名字
- 利用{}创建复合表达式
- 及时注释 // /* */
2.2.4 Scala运行模式
- 交互模式
- CMD运行scala
- CMD运行scala
- 脚本模式
-
创建一个源文件:HelloWorld.scala,保存在目录:D:\software\scala-2.12.3\bin 下,并在其中编写以下代码
-
CMD中编译执行
-
2.3 运算符和规范实战
scala> 1.+(2)
res10: Int = 3
scala> 1+2*3-4
res11: Int = 3
scala> 1+(2*3)-4
res12: Int = 3
scala> var m =0
m: Int = 0
scala> m += 1
scala> m
res15: Int = 1
scala> m *= res12 + 3
scala> m
res17: Int = 6
scala> m = 2 m: Int = 2
scala> m *= res12 + 3
scala> m
res19: Int = 12
scala> val val = 1
<console>:1: error: illegal start of simple pattern
val val = 1
^
scala> val def = 1
<console>:1: error: illegal start of simple pattern
val def = 1
^
scala> :power
** Power User mode enabled - BEEP WHIR GYVE **
** :phase has been set to 'typer'. **
** scala.tools.nsc._ has been imported **
** global._, definitions._ also imported **
** Try :help, :vals, power.<tab> **
scala> nme.keywords
res21: Set[$r.intp.global.TermName] = Set(abstract, >:, true, val, do, throw, <-, package, _, macro, @, object, false, this, if, then, var, trait, ., catch, with, def, else, class, type, #, lazy, null, =, <:, override, protected, =>, private, sealed, finally, new, implicit, extends, final, for, return, case, import, forSome, :, super, while, yield, try, match, <%)
scala> if (m>1){
| println(m)
| }
12
scala> //comment
scala> /*
| comment1
| comment2
| */
| m
res24: Int = 12
scala> print(m)
12
scala> println(m)
12
- 创建代码文件 D:\tmp\test1.scala.txt
val v1 = 3
var v2 = v1 + 4
println(v1,v2)
- 执行文件
C:\Users\THINKPAD>
D: D:\>cd tmp
D:\tmp>scala test1.scala.txt
(3,7)
D:\tmp>
2.3.1 列表
scala> val lis1 = List(1,2,3)
lis1: List[Int] = List(1, 2, 3)
scala> val lis2 = List(1,2,'a')
lis2: List[Int] = List(1, 2, 97)
scala> val lis3 = List('c','b','a')
lis3: List[Char] = List(c, b, a)
scala> lis3(0)
res9: Char = c
scala> val pls1 = List(3,4,5,6)
pls1: List[Int] = List(3, 4, 5, 6)
scala> pls1(1)
res10: Int = 4
scala> pls1.filter(x => x>4)
res11: List[Int] = List(5, 6)
scala> pls1.filter(_>4)
res12: List[Int] = List(5, 6)
scala> 0 max 10
res19: Int = 10
scala> val pv3 = 123.45f
pv3: Float = 123.45
scala> pv3/3
res20: Float = 41.149998
scala> pv3/3 max 30
res21: Float = 41.149998
scala> val yb1 = (pv3/3 max 30) > 40
yb1: Boolean = true
scala> 0 min 10
res22: Int = 0
scala> pls1
res25: List[Int] = List(3, 4, 5, 6)
scala> 2 :: pls1
res26: List[Int] = List(2, 3, 4, 5, 6)
scala> yb1 :: pls1
res27: List[AnyVal] = List(true, 3, 4, 5, 6)
scala> val pls2 = List(7,8)
pls2: List[Int] = List(7, 8)
scala> pls1 ::: pls2
res28: List[Int] = List(3, 4, 5, 6, 7, 8)
2.3.2 集合
scala> val set1 = Set(3,3,4,5,5)
set1: scala.collection.immutable.Set[Int] = Set(3, 4, 5)
scala> set1(0)
res13: Boolean = false
scala> set1(1)
res14: Boolean = false
scala> set1.head
res17: Int = 3
scala> set1.last
res18: Int = 5
scala> set1(4)
res29: Boolean = true
大数据视频推荐:
CSDN
大数据语音推荐:
企业级大数据技术应用
大数据机器学习案例之推荐系统
自然语言处理
大数据基础
人工智能:深度学习入门到精通