mac推荐安装方式,执行如下命令,不需配置额外的环境变量:
brew install scala
几种不同的变量声明方式:
scala> val myStr = "Hi" //不带类型
scala> val myStr2 : String = "Hi"//带类型
scala> val myStr2 : java.lang.String = "Hi" //包含类型的包路径
变量类型一共有两种:
-
val不可变类型
-
var声明时可变类型
Scala基础
Scala与C类似,有8种基本变量类型,但每个类型是一个“类”,属于scala包下的成员,比如Int的全名是scala.Int。Scala中使用Java的String来表示字符串,并不需要手动导包,系统会自动导入java.lang._ 。Scala中存在一个字面量的概念,举个例子,如3就是Int的字面量,true就是布尔值得字面量。Scala支持字面量直接执行方法。如执行5.toString()
可将整型转换为String类型。
每中基本操作,如加减乘除,每种操作都是一个方法,a + b
等价于 a.+(b)
。和Python类似,提供了Range的操作,写法不同,但很好理解,包括三种类型:
1 to 5 //包含5
1 until 5 //不包含5
1 to 10 by 2 //步长为2
0.5f to 5.9f by 0.8f //也支持小数的操作
在输出上,Scala不仅支持Java格式的print
、println
,同时支持C风格的printf
。
在判断语句中,基本写法与Java一致,但也有Python相同的写法:
这条语句执行后 a 的值为-1.
在循环上,保持了与Java一致的while
、do while
循环,for循环则更加灵活。有几种形式:
-
基础形式:
for(变量 <- 表达式)
,如for( i <- 2 to 6)
-
Guard表达式,在for循环提供了过滤:
for( i <- 2 to 6 if i%2 == 1 )
,循环结果只有奇数 -
支持多个生成器,
for(j <- 5 to 10 by 2; k <- 1 to 3) println(j*k)
,结果为两个的笛卡尔积,也可以看做是Java的两层循环,前个生成器是外层循环,后个循环是内层循环。 -
在多个生成器的基础上支持Guard表达式,如第二条。
-
支持推导式,可以将for循环的结果存到一个集合当中,
for(j <- 5 to 10 by 2; k <- 1 to 3 if k%2 == 1) yield k
,格式非常简洁。
数组(Array)的使用与C基本一致,只是在每个数组元素赋值使用圆括号,而不是方括号。
列表(List)中,可以通过::
连接两个列表。
元组(Tuple)是包含不同类型元素的一个集合。读取元组的元素时,通过元组名._下标
的方式读取,下标是从1开始,而不是0.
集(Set)是与List类似的集合,Set采用了哈希算法存储,能以O(1)时间复杂度查找元素,与List不同,Set中不存在重复元素。
映射(Map)是Key-Value键值对的集合。创建Map对象值得注意的一点是,默认创建的Map为不可变对象,无法对Map中的元素进行添加等操作。创建可变Map,需要导入scala.collection.mutable.Map
包,与Java使用add方法添加元素不同,Scala使用+=
或操作符来向map添加新元素,=
不仅可以更新元素Vaule,如果Key不存在,则添加元素。映射的遍历:for ((k,v) <- 映射) 语句块
。
迭代器(Iterator)可以辅助集合的迭代,用法如下。
迭代器只有两种方法,next
与hasNext
,含义与其名字一致。执行next方法时,出了将当前元素指向下一个,也会返回当前元素。for循环可以使用迭代器,在for循环中,自动调用了next
方法。
集合操作
map,这个map指的是对集合的操作,而不是键值对的Map。map操作实现对集合中的每个元素都应用通一种操作。定义List集合,val books = List("Hadoop", "Hive", "HDFS")
,对集合执行map操作,books.map(s => s.toUpperCase)
执行结果如下,每个字母都变成大写:
res0: List[String] = List(HADOOP, HIVE, HDFS)
flapMap,这个是在map操作的基础上,进行了“拍扁”(flap操作),books flatMap (s => s.toList)
,结果对比清晰可见。
scala> val books = List("Hadoop", "Hive", "HDFS")
books: List[String] = List(Hadoop, Hive, HDFS)
scala> books map (s => s.toList)
res13: List[List[Char]] = List(List(H, a, d, o, o, p), List(H, i, v, e), List(H, D, F, S))
scala> books flatMap (s => s.toList)
res14: List[Char] = List(H, a, d, o, o, p, H, i, v, e, H, D, F, S)
例子中map与flapMap区别在于flapMap在执行变换后,又将多个List合并为一个List。
filter则对已有数组直接过滤,如创建Map,通过key值对结果进行过滤:
reduce做归约操作,又细分为reduceLeft
和reduceRight
,分别从左和分别从右开始。
fold折叠操作,与reduce类似,但会提供一个初始参数。