Scala_1

学习Scala第一天

REPL:Read(取值) -> Evaluation(求值)->Print(打印) ->Loop(循环)

  • paste是计入粘贴模式
  • tab键可以自动补全
  • 内置变量
    例如: 输入1+1 会看到res0:lnt=2
    2.0*res0,返回res1: double=4.0
  • 声明变量
    1.val : 值不可变
    Scala_1_第1张图片
    2.var : 值可变
    Scala_1_第2张图片
  • 指定类型
    无论声明变量val,还是var变量,都可以手动指定,如不手动指定,scala会自动根据值进行类型的推断
  • 声明多个变量
    可以将多个变量放在一起进行声明
    例如:val name1,name2:String=null
  • 基本数据类型
    Byte、Char、short、int、Long、Float、Double、Boolean、
    scala没有基本数据与包装数据类型的概念,同意都是类。scala自己会负责基本数据类型与应用数据类型的转化操作
  • 基本操作符
    +、-、*、/、%等,以及&&、||、^、>>,<<等,没有 ++ 与 –
    自加只能用 +=,自减用 -=
  • 函数调用方式
    没有参数时可以省略()
  • apply 函数
    Scala_1_第3张图片
  • scala一行可以写多条语句,中间用 ; 隔开
    一.if表达式
  • if表达式的定义
    在scala中,if表达式是有值的,就是if或者else中最后一行语句返回的值
    例: scala> val age=30;if(age>20) 1 else 0
    age: Int = 30
    res7: Int = 1
  • if表达式的类型推断
    如果if与else子句的类型不同,scala就会取俩个类型的公共的父类型
    例:String与int的父类型是 Any
    如果if后面没有跟else,则else返回Unit
  • 将if语句放在多行中
    Scala_1_第4张图片
  • 语句终结符与快表达式
    1.一行方多条语句,必须使用语句终结符 ;
    2.对于多行语句,使用 {} 的方式
    3.块表达式也用 {}

二.输出与输入

  • printprintln :print不会换行,println 会换行
  • printf 可进行格式化
    在这里插入图片描述
  • readLine允许我们从控制台读取用户输入的数据类似Java中的Sanner
  • 综合游戏:游戏厅门禁
    Scala_1_第5张图片
    三.循环
  • while do循环
    Scala_1_第6张图片
  • scala没有for循环,只能用while代替for,或者用简易板的for语句
    1.var n=10;for(i <- 1 to n )println(i)
    2.to为闭区间,until为左闭右开区间
  • 高级for循环
  1. 多重for循环:九九乘法表
    Scala_1_第7张图片
    2.if守卫:取偶数
    for(i<- 1 to 100 if i%2==0)println(i)
    3.for推导式,构建集合 yield
    在这里插入图片描述
  • 跳出循环语句
    scala没有提供类似Java的break语句,但是可以使用Boolean类型变量,return或者breaks的break函数来代替
    Scala_1_第8张图片
    四.函数
  • scala中定义函数时,需定义函数的函数名,参数,函数体
    例 def sayHello(name:String,age:Int)={if(age>18){printf(“hi %s,you are a big boy\n”,name);age}else{printf(“hi %s ,you are a little boy\n”,name );age}}
    函数调用:sayHolle(“xiali”,30)
    def:定义函数的关键字
    sayHolle:函数名
    ()里为参数
    {}里是函数体
  • 在代码块中定义包含多行语句的函数体
    scala> def sayHolle(name:String)=print(“hello,”+name)
    sayHolle: (name: String)Unit

scala> sayHolle(“losi”)
hello,losi
1.实现累加的功能
Scala_1_第9张图片
2.实现经典的斐波那锲数列:
9+8;8+7+7+6;7+6+6+5+6+5+5+4;…
Scala_1_第10张图片

  • 默认参数
    例如:
def sayHello(firstName:String,middleNmae:String="wangwu",lastName:String="xigua")=firstName+ ""+middName+""+lastName

注:如果给出参数不够,则会从左往右依次应用参数,在调用参数是,也可以不按照函数定义的参数顺序来传递参数,而使用带名参数的方式来传递,还可以混合使用未命名参数和待命参数,但未命名参数必须排在带名参数前面

  • 变长参数
    在参数类型后面加 * 如下代码
    Scala_1_第11张图片
  • 使用序列调用变长参数
    在如果想要将一个已有的序列直接调用变长参数,是不对的.比如val s=sum(1 to 5).此时需要使用scala特殊 的语法将参数定义为序列,让scala解释器能够识别
    val s= sum(1 to 5:_*)
    案例
    Scala_1_第12张图片
    head是头(1),tail是除了头的全部(2,3,4,5)
    五.过程
    函数的返回值的类型为Unit或没有,就是过程
    def sayHello(name:String)=“Hello,”+name
    def sayHello(name:String){print(“heloo,”+name);“Hello,”+name}
    def sayHello(nam:String):Unit=“Hello,”+name
    六.lazy值
    lazy val lines=fromFile(“C://Users//Administrator//Desktop//test.txt”)
    将一个变量声明为lazy时,则只有在第一次使用改变量时,变量对应的表达式才会发生计算.这种特性对于特别耗时的计算操作特别有用,比如打开文件进行IO,进行网络IO等
    七.异常Scala_1_第13张图片
    Scala_1_第14张图片
    Scala_1_第15张图片
    八.数组
  • Array代表的含义与Java中类似,也是长度不可改变的数组
    数组初始化后,长度就固定下来了,而且元数全部根据其类型初始化
    Scala_1_第16张图片
  • 可以直接使用Array()创建数组,元数类型自动推断
    Scala_1_第17张图片
  • ArrayBuffer(长度可变的集合)
    1.如果不想每次都是用全限定名,则可以预先导入ArrayBuffer类
    import scala.collection.mutable.ArrayBuffert
    2.创建一个空的ArrayBuffer
    val a=ArrayBufferInt
  • 添加元数
    a +=1
    a +=(2,3,4,5,6)
  • ++=操作符,可以将其他集合中的所有元素
    a ++=Array(7,8,90)
  • trimEnd()函数,可以从尾部截断指定个数的元数
    a.trimEnd(2)
  • insert()函数可以在指定位置插入元素
    a.insert(5,6)
    在索引为5的位置插入6
  • remove()函数为在指定位置删除元数
    a.aremove(8)
    删除索引为八的元数
    a.remove(2,6)
    删除索引为2到6 的元数,为闭区间
  • Array与ArrayBuffer互相转化
    b.toArray(将ArrayBuffer转换为Array)
    a.toBuffer(将Array转化为ArrayBuffer)
  • 遍历Array与ArrayBuffer
    1.使用until是richInt提供的函数Scala_1_第18张图片
    2.从尾部遍历
    Scala_1_第19张图片
    3.跳跃遍历Scala_1_第20张图片
    4.增强for遍历
    Scala_1_第21张图片
  • .数组的常见操作
    1.数组求和
    val sum=a.sum
    2.获取数组最大值
    val max=a.max
    3.对数组进行排序(不能用于ArrayBuffer)
    scala.util.Sorting.quickSort(a)
    4.获取数组中所有元素
    Scala_1_第22张图片
    九.数组之间的转化
  • 使用yield和函数式编程转化数组
    1.对于Array进行转换,获取的还是Array
    Scala_1_第23张图片
    2.对于ArrayBuffer进行转换,获取的还是ArrayBuffer
    3.使用函数式编程转换数组(通常使用第一种)
    Scala_1_第24张图片
    4.算法案例
    只要一个负数,后面的都不要
    Scala_1_第25张图片

Scala_1_第26张图片
十.Map与Tuple

  • 创建Map
    1.创建不可变的Map
    Scala_1_第27张图片
    2.创建可变的Map
    Scala_1_第28张图片
    3.另一种方式定义Map元素
    val ages2=Map((“loe”,30),(“Jen”,25),(“Jack”,23))
    4.创建空的HashMap
    val ages3=new scala.collection.mutable.HashMap[String,Int]
    • 访问Map的元素
      1.根据key对应的 value,如果key不存在,就会报错在这里插入图片描述
      2.使用contains函数和getOrElse函数检查key是否存在
      Scala_1_第29张图片
    • 修改Map的元素
      1.对于可变的Map的增加
      在这里插入图片描述
      2.对于可变的Map的删除
      在这里插入图片描述
      3.对于不可变元素的增加与删除
      Scala_1_第30张图片
      注:Array与ArrayBuffer可变与不可变是指长度
      Map的可变与不可变是指Map的值
    • 遍历Map
      1.遍历Map的entrySet与遍历Map的key
      Scala_1_第31张图片
      2.生成新的Map,反转key和value
      在这里插入图片描述
  • SortedMap和LinkedHashMap
    1.SortedMap可以自动对key进行排序
    在这里插入图片描述
    2.LinkedHashMap可以记住插入entry的顺序
    Scala_1_第32张图片
  • Map的元素类型–Tuple
    1.简单Tuple与访问
    Scala_1_第33张图片
    2.zip操作(拉链操作)
    Scala_1_第34张图片

你可能感兴趣的:(Scala_1)