一、函数高级应用

1、函数传名调用

传值调用:先计算参数表达式的值,在传到函数内部
传名调用:先将为计算的参数传入函数内部,等到需要再去计算

  1. //传值调用
  2. def main(args: Array[String]): Unit = {
  3. fun2(fun1())
  4. }
  5. def fun1 ():String={
  6. println("调用第一个函数")
  7. return "第一个函数的返回值"
  8. }
  9. def fun2 (t:String):Unit={
  10. println("调用之前")
  11. println(t)
  12. println("调用之后")
  13. }
  14. 输出: 调用第一个函数
  15. 调用之前
  16. 第一个函数的返回值
  17. 调用之后
  18. //传名调用
  19. def main(args: Array[String]): Unit = {
  20. fun2(fun1())
  21. }
  22. def fun1 ():String={
  23. println("调用第一个函数")
  24. return "第一个函数的返回值"
  25. }
  26. def fun2 (t: => String):Unit={
  27. println("调用之前")
  28. println(t)
  29. println("调用之后")
  30. }
  31. 输出: 调用之前
  32. 调用第一个函数
  33. 第一个函数的返回值
  34. 调用之后

2、指定函数参数名调用

  1. //指定函数参数名调用
  2. def fun2(a:Int,b:Int):Unit={
  3. println(a)
  4. println(b)
  5. }
  6. def main(args: Array[String]): Unit = {
  7. fun2(b=11,a=55)
  8. }

3、可变参数的函数

  1. //可变参数的函数
  2. def fun3(paras:String*):Unit= {
  3. for (temp <- paras) {
  4. println(temp)
  5. }
  6. }
  7. def main(args: Array[String]): Unit = {
  8. fun3("11","2","fff","hgh")
  9. }

4、默认参数值的函数

  1. //默认参数值的参数
  2. def fun4(a:Int=2,b:Int=6):Int={
  3. return a*b
  4. }
  5. def main(args: Array[String]): Unit = {
  6. println(fun4())
  7. println(fun4(1))
  8. println(fun4(8,9))
  9. }

5、递归函数

  1. //递归函数
  2. def fun5(i:Int):Int={
  3. if (i==1){
  4. return 1
  5. }else{
  6. return i*fun5(i-1)
  7. }
  8. }
  9. def main(args: Array[String]): Unit = {
  10. println(fun5(5))
  11. }

6、高阶函数

  1. //高阶函数
  2. def fun6(t: =>String):Unit={
  3. println("函数二开始")
  4. println("t")
  5. println("函数二结束")
  6. }
  7. def temp ():String={
  8. println("调用函数一")
  9. return "res";
  10. }
  11. def main(args: Array[String]): Unit = {
  12. fun6(temp())
  13. }

7、内嵌函数

  1. //内嵌函数
  2. def fun7(a:String):Unit={
  3. def function7(b:String):Unit={
  4. println(b)
  5. }
  6. function7(a)
  7. }
  8. def main(args: Array[String]): Unit = {
  9. fun7("aaa")
  10. }

8、匿名函数

  1. //匿名函数
  2. var fun8 = (x:Int) => x+1
  3. def main(args: Array[String]): Unit = {
  4. println(fun8(4))
  5. }

9、偏应用函数

不需要提供函数需要的所有参数,只需要提供部分,或不
提供所需参数
实现方法:绑定函数的一部分参数,非绑定部分用”_”代
替,从而形成偏应用函数去使用

  1. //偏应用函数
  2. def fun9 (name:String,msg:String)={
  3. println(name + "--"+msg)
  4. }
  5. def main(args: Array[String]): Unit = {
  6. var nnn = "张三"
  7. var tempfun = fun9(nnn,_:String)
  8. tempfun("上午好")
  9. tempfun("中午好")
  10. tempfun("下午好")
  11. }

10、函数柯里化

  1. //函数柯里化
  2. //正常写法
  3. def add (a:Int,b:Int): Int ={
  4. return a+b
  5. }
  6. //柯里化1
  7. def add1 (a:Int):Int => Int ={
  8. ( b : Int)=>a+b
  9. }
  10. //柯里化2
  11. def add2 (a:Int)(b:Int)=a+b
  12. def main(args: Array[String]): Unit = {
  13. var add11 = add1(3)
  14. var add22 = add2(3)(_)
  15. println(add11(4))
  16. println(add22(4))
  17. }

二、集合collection

1、概念说明

  • 与Java中的类似,分为可变集合和不可变集合
  • 常用集合:Scala list、Scala Map、Scala Set、Scala 元组、Scala option、Scala Iterator迭代器

    2、Scala List(列表)

  1. 类似数组,要求所有元素类型相同
  2. 是不可变集合,定了就无法改变
  3. 列表具有递归定义的性质,可以嵌套定义,这是与数组最大的不一样。
  4. Seq是一个特征,List是一个实现。也可以使用Seq
    1. //列表初始化
    2. //字符串列表
    3. val list1:List[String] = List("11","dd","ggg")
    4. val list11 = "python" :: ("c++" :: Nil)
    5. val list111 = "112" :: ("aaa" :: Nil)
    6. //整型列表
    7. val list2:List[Int] = List(1,2,3,4)
    8. //空列表
    9. val list3:List[Nothing] = List()
    10. //二维列表
    11. val list4:List[List[String]] = List(List("22"),List("2"))
    常用操作:
  • head 返回列表第一个元素
  • tail 返回除第一个元素之外的其他元素
  • isEmpty 在列表为空时返回true
  • ::: 或者 List.::: 或者 List.concat 方法连接两个或多个列表
  • List.reverse 用于将列表的顺序反转

    3、Scala Set(集合)

  1. 没有重复的对象的集合,所有元素都是唯一的
  2. Set分为可变和不可变集合两种
  3. 默认使用不可变集合,完整类路径为:scala.collection.immutable.Set
  4. 若要引用可变集合类型,则类路径为:scala.collection.mutable.Set
  1. //可变集合
  2. var set2 = scala.collection.mutable.Set (5,6,8,9,0,3)
  3. println(set2)
  4. println(set2.getClass.getName)
  5. set2.add(1)
  6. println(set2)
  7. set2.remove(0)
  8. println(set2)
  9. //转换为不可变
  10. val set3 = set2.toSet
  11. println(set3.getClass.getName)

常用操作:

  • head 返回第一个值
  • tail 返回除第一个外所有值
  • isEmpty 在集合为空时返回true
  • 使用 ++ 或者 Set.++来连接两个集合
  • set.min set.max 来查找最小和最大元素
  • set.&或者set.intersect 查看两个元素的交集

    4、Scala Map(映射)

  1. 一种可迭代的键值对结构
  2. 所有值都是通过键来获取的。键是唯一的
  3. 分为可变和不可变
  4. 默认是不可变,可变需要使用import scala.collection.mutable.Map

    1. // Scala Map
    2. //不可变的空Map
    3. var map1 : Map [String,Int] = Map()
    4. //不可变初始化
    5. var map2 = Map("这是1"-> 1 ,"这是2"-> 2 ,"这是3"-> 3 ,"这是4"-> 4 ,"这是5"-> 5 )
    6. //向不可变中添加值
    7. map1 += ("zzz"->8)
    8. map2+= ("aaaa"->9)
    9. println(map1)
    10. println(map2)
    11. //初始化可变Map
    12. val map3 = scala.collection.mutable.Map("这是1"-> 1 ,"这是2"-> 2 ,"这是3"-> 3 ,"这是4"-> 4)
    13. map3 .put("zzz",8)
    14. println(map3)

    关于Map可变与不可变的总结:
    不可变:取决于val 和 var, val只能读 var可以读写
    可变:不论val 和 var 都可以读写
    常用操作:

  • keys:返回Map所有的键
  • values:返回所有的值
  • isEmpty:在Map为空时返回true
  • 使用++或者Map.++连接两个集合,合并时会移除重复的K
  • 使用Map.contains,查看Map中是否存在K

    5、元组

  1. 与列表相似,元组时不可变的
  2. 与列表不同的是元组可以包含不同类型的元素
  3. 元组是通过()来定义的

    1. //Scala元组
    2. var yuanzu1 = (1,2,4,"aa","44")
    3. var yuanzu2 = new Tuple4(1,1,1,2)
    4. //元组的访问通过下标,第一个元素为 _1,以此类推
    5. println(yuanzu1._1)
    6. //元组的遍历
    7. yuanzu1.productIterator.foreach(i=>println(i))

    6、Option

  4. 表示有可能包含值的容器,也可能不包含值,主要表示一个值是可选的

  5. Option【T】是一个可选值为T的容器,如果存在内容,则为Some【T】,否则就是None
  6. 方法getOrElse()来确定是否包含某个值,如果包含就返回,不包含就返回默认值
  7. isEmpty()来检测元组中的元素是否为None

    1. //Scala Option
    2. //先定义一个Map对象
    3. var map = Map("java"->"java程序设计","c"->"c程序设计","js"->"js程序设计","py"->"py程序设计")
    4. var option:Option[String] = map.get("java")
    5. var option1 = None
    6. println(option)
    7. println(option.isEmpty)
    8. println(option.getOrElse("c","bucunzai"))
    9. println(option1.getOrElse("bucunzai"))

    总结:getOrElse()方法在Map和Option都可以使用。

    7、Iterator 迭代器

  8. 它不是一个集合,它是一个访问集合的方法

  9. 基本操作时hasnext和next
  10. size、length 返回迭代器对应集合的长度
  11. max返回集合最大值,min返回最小值
  12. hasNext()判断集合是否还有下一个元素
  13. Next()返回下一个元素
  14. 注意:迭代器只能调用一次

    1. def main(args: Array[String]): Unit = {
    2. //Iterator迭代器
    3. var it1 = Iterator("11",2,"java","c")
    4. var it2 = Iterator(2,4,5,7,8)
    5. var it3 = Iterator(2,4,5,7,8)
    6. var it4 = Iterator("java","c++","scala")
    7. var it5 = Iterator("java","c++","scala")
    8. while (it1.hasNext){
    9. println(it1.next())
    10. }
    11. println("------------------------")
    12. println(it4.length)
    13. println(it1.size)
    14. println(it4.max)
    15. println(it5.min)
    16. }

    三、类和对象

    大体与Java很相似
    Scala的类和对象特点:

  15. 一个Scala源文件中可以有多个类

  16. 类的访问修饰符默认public,不需要指定
  17. 类本身不能作为程序入口,必须通过定义Object对象,该对象的main方法作为程序入口

    1、基础使用

    ```scala class student(onename:String,oneage:Int){ var name:String = onename var age:Int = oneage

    def func(msg:String): String ={ return msg } }

object TestPersion{ def main(args: Array[String]): Unit = { var stu = new student(“张三”,21) println(stu.name) println(stu.age) println(stu.func(“aaaaaa”)) } }

  1. <a name="oRpT8"></a>
  2. ## 2、类的继承
  3. 1. scala继承一个类和Java相似,也有一些不同
  4. 1. 重写一个非抽象方法必须加overwrite
  5. 1. 只有主类的构造函数才能向基类放参数
  6. <a name="FjZ2n"></a>
  7. ## 3、单例模式
  8. 1. 在Scala中没有static
  9. 1. Scala使用object关键字解决单例模式,object和class的区别是object不能带参数
  10. 简单版单例模式
  11. ```scala
  12. object ChineseSingleton {
  13. var skinColor = "Yellow"
  14. var country = "中国人"
  15. }
  16. object TestSingleton {
  17. def main(args: Array[String]): Unit =
  18. {
  19. println(ChineseSingleton.skinColor)
  20. println(ChineseSingleton.country)
  21. ChineseSingleton.skinColor = "黄色";
  22. println(ChineseSingleton.skinColor) }
  23. }

Scala版本单例模式

  1. 伴生对象:除了定义的类之外,还要定义一个同名object对象
  2. 必须在同一个源文件里定义
  3. 类和他的伴生对象可以互相访问其私有成员 ```scala /**
  • 定义伴生类 / class TaskManager private (oneName: String) { //将构造方法传入的局部变量,传递成类的成员变量,方便后续在外部使用使用 var name: String = oneName //定义成员方法 def getName(): String = { return name; } } /*
  • 定义伴生对象 / object TaskManager { var taskManager = new TaskManager(“windows 任务管理 器”); def getSingletonInstance(): TaskManager = { return taskManager } } /*
  • 测试单例模式 */ object TestSingleton { def main(args: Array[String]): Unit = { var singleton = TaskManager.getSingletonInstance(); println(singleton.getName()); } } ```

    4、特征 trait

  1. 相当于Java的接口和抽象类二合一
  2. 支持多继承
  3. 用关键字trait定义关键字 ```scala /**
  • 定义核心计算特征 / trait CalcuteCoreTrait { def add(a: Int, b: Int): Int = a + b def minus(a: Int, b: Int): Int = a - b def factorial(n: Int): Int } class TLCalculator(oneName: String) extends CalcuteCoreTrait { var name = oneName def factorial(n: Int): Int = { if (n <= 1) { return 1 } else { return n factorial(n - 1) } } } object TestTrait { def main(args: Array[String]): Unit = { var tl:CalcuteCoreTrait=new TLCalculator(“晨光计 算器”) var a=3 var b=4 println(“a+b=”+tl.add(a, b)) println(“a-b=”+tl.minus(a, b)) println(“b!=”+tl.factorial(b)) } } ```