Scala基础笔记

来源:互联网 发布:js简单相册 编辑:程序博客网 时间:2024/06/05 11:40

Scala

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格式的printprintln,同时支持C风格的printf

在判断语句中,基本写法与Java一致,但也有Python相同的写法:

 
val x = 0
val a = if (x>0) 1 else -1

这条语句执行后 a 的值为-1.

在循环上,保持了与Java一致的whiledo while循环,for循环则更加灵活。有几种形式:

  1. 基础形式:for(变量 <- 表达式) ,如for( i <- 2 to 6)

  2. Guard表达式,在for循环提供了过滤:for( i <- 2 to 6 if i%2 == 1 ),循环结果只有奇数

  3. 支持多个生成器,for(j <- 5 to 10 by 2; k <- 1 to 3) println(j*k),结果为两个的笛卡尔积,也可以看做是Java的两层循环,前个生成器是外层循环,后个循环是内层循环。

  4. 在多个生成器的基础上支持Guard表达式,如第二条。

  5. 支持推导式,可以将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)可以辅助集合的迭代,用法如下。

 
val iter = Iterator("Hadoop","Spark","Scala")
while (iter.hasNext) {
    println(iter.next())
}

迭代器只有两种方法,nexthasNext,含义与其名字一致。执行next方法时,出了将当前元素指向下一个,也会返回当前元素。for循环可以使用迭代器,在for循环中,自动调用了next方法。

 
val iter = Iterator("Hadoop","Spark","Scala")
for (elem <- iter) {
    println(elem)
}

集合操作

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值对结果进行过滤:

 
val university = Map("ZJU" -> "Zhejiang University", "MS" -> "MicroSoft")
university filter(kv =>kv._1 contains "ZJ")
res22: scala.collection.immutable.Map[String,String] = Map(ZJU -> Zhejiang University)

reduce做归约操作,又细分为reduceLeftreduceRight,分别从左和分别从右开始。

 
scala> val list = List(1,2,3,4,5)
list: List[Int] = List(1, 2, 3, 4, 5)
scala> list.reduceLeft(_ + _)
res21: Int = 15

fold折叠操作,与reduce类似,但会提供一个初始参数。

 
scala> val list = List(1,2,3,4,5)
list: List[Int] = List(1, 2, 3, 4, 5)
scala> list.fold(10)(*)
res0: Int = 1200

0 0