Scala系列

Posted 莫同学vv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala系列相关的知识,希望对你有一定的参考价值。

这是 Scala 编程的第二篇


变长参数


Scala 中也可以将函数定义为参数个数可变的形式,可以使用变长参数来定义函数,例如:

// 在数据类型后加上星号 * ,代表可变成参数def sum(nums:Int*)={ var i = 0 for(num<-nums) res += num res}


使用序列调用变长参数函数


一个已有的序列调用变长参数函数,例如:

// 错误写法val i = sum(1 to 5)
// 正确写法val i = sum(1 to 5:_*)


使用递归函数实现累计,例如:

def sum(nums:Int*):Int = { if(nums.length == 0) 0 else nums.head + sum(nums.tail:_*)}


函数的过程


如果函数体直接写在花括号里,不使用等号连接,那么函数的返回值类型就是Unit,这样的函数称之为过程,它不需要返回值,或者将返回值的类型定义为Unit,例如:

// 正常函数写法def test(str:String) = str
// 过程的写法,不需要等号来连接花括号中的函数体def test(str:String){ print(str)}
// 或者将函数的返回值的类型定义为Unitdef test(str:String):Unit = str


lazy 修饰符


如果一个变量用 lazy 修饰,那么只有在第一次使用该变量时,该变量的表达式才会进行计算,这种特性对耗时的操作特别有用,比如打开文件,进行网络 IO 等等,例如:

import scala.io.Source._lazy val text = fromFile("C://test.txt").mkString

如果文件不存在也不会报错,只有使用了该变量时才会报错


异常


Scala 中的异常处理和捕获机制与 Java 相似,区别在 catch 中用模式匹配来匹配异常,例如:

try{ throw new IOException("user defined exception")}catch{ case e1:illegalArgumentException => println("illegal argument") case e2:IOException => println("io exception")}


数组Array


Array 是长度不可改变的数组,底层实际上是 Java 数组,字符串数组在底层就是 Java 的 String[],整数数组底层就是 Java 的 Int[],数组初始化后长度就固定下来了,例如:

// 定义数组时,指定数组类型val a = new Array[Int](5)val b = new Array[String](5)
// 可以使用 Array() 创建数组,元素类型会自动推断val c = Array("zhangsan","lisi")


ArrayBuffer


ArrayBuffer 类似 Java 中的 ArrayList,是一种可变长度的集合类

// 使用 ArrayBuffer 要预先导入类import scala.collection.mutable.ArrayBuffer
// 创建一个空的 ArrayBufferval a = ArrayBuffer[Int]()
// 使用 += 操作符来添加一个或多个元素a += 1a += (2,3,4)// 使用 ++= 操作符来添加集合中所有元素a ++= Array(5,6,7)
// 使用 trimEnd() 函数从尾部截取指定个数的元素a.trimEnd(3)
// 使用 insert() 函数在指定位置插入元素,效率很低,因为要移动该元素后的所有元素a.insert(5,6)a.insert(5,6,7,8)
// 使用 remove() 函数移除指定位置的元素a.remove(1)a.remove(1,3)
// Array 与 ArrayBuffer 可以互相转换 a.toBuffer a.toArray


遍历 Array 和 ArrayBuffer

// 使用 for 循环和 until 遍历 Array 和 ArrayBuffer,until 是 RichInt 提供的函数for(i <- 0 until a.length) println(a(i))
// 跳跃遍历 Array 和 ArrayBufferfor(i <- 0 until (a.length,2)) println(a(i))
// 从尾部遍历 Array 和 ArrayBufferfor(i <- (0 until a.length).reverse) println(a(i))
// 使用 “增强 for 循环” 遍历 Array 和 ArrayBufferfor(e <- b) println(e)


数组常用的操作

// 数组元素求和val a = Array(1,2,3)val b = a.sum
// 获取数组最大值val c = a.max
// 对数组进行排序scala.util.Sorting.quickSort(a)
// 获取数组中所有元素a.mkString
// 获取数组中所有元素,用逗号隔开a.mkString(",")
// 转换数组数据类型a.toString


使用 yield 和函数式编程转换数组

// 对 Array 进行转换val a = Array(1,2,3)val b = for(i <- a) yield i * i
// 对 ArrayBuffer 进行转换val c = ArrayBuffer[Int]()c += (1,2,3)val d = for(i <- c) yield i * i
// 用 if 守卫转换需要的元素val e = for(i <- if i % 2 ==0) yield i * i
// 使用函数式编程转换数组a.filter(_ % 2 == 0).map(2 * _)a.filter(_ % 2 == 0).map{2 *_}


创建 Map

// 创建一个不可变的 Mapval ages = Map("zhangsan" -> 10, "lisi" -> 20, "wangwu" ->30)
// 创建一个可变的 Mapval ages = scala.collection.mutable.Map("zhangsan" -> 10, "lisi" -> 20, "wangwu" ->30)
// 使用另一种方式定义 Mapval ages = Map(("zhangsan",10),("lisi",20),("wangwu",30))
// 创建一个空的 HashMapval ages = new scala.collection.mutable.HashMap[String,Int]


访问 Map 的元素

// 获取指定 key 的 value,如果 key 不存在则报错val age = ages("zhangsan")
// 使用 contains 函数检查 key 是否存在val age1 = if(ages.contains("zhangsan")) ages("zhangsan") else 0
// 使用 getOrElse 函数获取值,如果 key 不存在则返回默认值val age2 = ages.getOrElse("zhangsan",0)


更新 Map 的元素

// 通过重新赋值更新 Map 的元素ages("zhangsan") = 20
// 用 += 操作符增加多个元素ages += ("zhaoliu" -> 35, "tom" -> 36)
// 用 -= 操作符移除元素ages -= "zhangsan"
// 更新不可变的 Mapval ages2 = ages + ("zhaoliu" -> 40, "tom" -> 41)
// 移除不可变 Map 的元素val ages3 = ages - "tom"


遍历 Map

// 遍历 map 的 entrySetfor((key,value) <- ages) println(key + "" +value)
// 遍历 map 的 keyfor(key <- ages.keySet) println(key)
// 遍历 map 的 valuefor(value <- ages.values) println(value)
// 用 yiled 生成新的 map,反转 key 和 valuefor((key,value) <- ages) yield (value,key)


SortedMap 和 LinkedHashMap

// SortedMap 可以自动对 Map 的 key 进行排序val ages = scala.collection.immutable.SortedMap("zhangsan" -> 10,"lisi" -> 20,"wangwu" -> 30)
// LinkedHashMap 可以记住 entry 的插入顺序val ages = new scala.collection.mutable.LinkedHashMap[String,Int]ages("zhangsan") = 10ages("lisi") = 20ages("wangwu") = 30


Tuple

// 创建 Tupleval t = ("zhangsan",10)
// 访问 tuple 里的值t._1
// zip 的组合操作val names = Array("zhangsan","lisi","wangwu")val ages = Array(10,20,30)val testZip = names.zip(ages)for((name,age) <- testZip) println(name + "" + age)



以上是关于Scala系列的主要内容,如果未能解决你的问题,请参考以下文章

Programming In Scala笔记-第二三章

Scala学习系列一

SpringBoot系列之集成Scala开发API接口

SpringBoot系列之集成Scala开发API接口

为什么Scala是可扩展的?

Scala入门系列:面向对象之object