学习Scala第一天
REPL:Read(取值) -> Evaluation(求值)->Print(打印) ->Loop(循环)
- paste是计入粘贴模式
- tab键可以自动补全
- 内置变量
例如: 输入1+1 会看到res0:lnt=2
2.0*res0,返回res1: double=4.0
- 声明变量
1.val : 值不可变

2.var : 值可变

- 指定类型
无论声明变量val,还是var变量,都可以手动指定,如不手动指定,scala会自动根据值进行类型的推断
- 声明多个变量
可以将多个变量放在一起进行声明
例如:val name1,name2:String=null
- 基本数据类型
Byte、Char、short、int、Long、Float、Double、Boolean、
scala没有基本数据与包装数据类型的概念,同意都是类。scala自己会负责基本数据类型与应用数据类型的转化操作
- 基本操作符
+、-、*、/、%等,以及&&、||、^、>>,<<等,没有 ++ 与 –
自加只能用 +=,自减用 -=
- 函数调用方式
没有参数时可以省略()
- apply 函数

- 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语句放在多行中

- 语句终结符与快表达式
1.一行方多条语句,必须使用语句终结符 ;
2.对于多行语句,使用 {} 的方式
3.块表达式也用 {}
二.输出与输入
- print 和 println :print不会换行,println 会换行
- printf 可进行格式化

- readLine允许我们从控制台读取用户输入的数据类似Java中的Sanner
- 综合游戏:游戏厅门禁

三.循环
- while do循环

- scala没有for循环,只能用while代替for,或者用简易板的for语句
1.var n=10;for(i <- 1 to n )println(i)
2.to为闭区间,until为左闭右开区间
- 高级for循环
- 多重for循环:九九乘法表

2.if守卫:取偶数
for(i<- 1 to 100 if i%2==0)println(i)
3.for推导式,构建集合 yield

- 跳出循环语句
scala没有提供类似Java的break语句,但是可以使用Boolean类型变量,return或者breaks的break函数来代替

四.函数
- 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.实现累加的功能

2.实现经典的斐波那锲数列:
9+8;8+7+7+6;7+6+6+5+6+5+5+4;…

def sayHello(firstName:String,middleNmae:String="wangwu",lastName:String="xigua")=firstName+ ""+middName+""+lastName
注:如果给出参数不够,则会从左往右依次应用参数,在调用参数是,也可以不按照函数定义的参数顺序来传递参数,而使用带名参数的方式来传递,还可以混合使用未命名参数和待命参数,但未命名参数必须排在带名参数前面
- 变长参数
在参数类型后面加 * 如下代码

- 使用序列调用变长参数
在如果想要将一个已有的序列直接调用变长参数,是不对的.比如val s=sum(1 to 5).此时需要使用scala特殊 的语法将参数定义为序列,让scala解释器能够识别
val s= sum(1 to 5:_*)
案例

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等
七.异常


八.数组
- Array代表的含义与Java中类似,也是长度不可改变的数组
数组初始化后,长度就固定下来了,而且元数全部根据其类型初始化

- 可以直接使用Array()创建数组,元数类型自动推断

- 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提供的函数
2.从尾部遍历

3.跳跃遍历
4.增强for遍历

- .数组的常见操作
1.数组求和
val sum=a.sum
2.获取数组最大值
val max=a.max
3.对数组进行排序(不能用于ArrayBuffer)
scala.util.Sorting.quickSort(a)
4.获取数组中所有元素

九.数组之间的转化
- 使用yield和函数式编程转化数组
1.对于Array进行转换,获取的还是Array

2.对于ArrayBuffer进行转换,获取的还是ArrayBuffer
3.使用函数式编程转换数组(通常使用第一种)

4.算法案例
只要一个负数,后面的都不要


十.Map与Tuple
- 创建Map
1.创建不可变的Map

2.创建可变的Map

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是否存在

- 修改Map的元素
1.对于可变的Map的增加

2.对于可变的Map的删除

3.对于不可变元素的增加与删除

注:Array与ArrayBuffer可变与不可变是指长度
Map的可变与不可变是指Map的值
- 遍历Map
1.遍历Map的entrySet与遍历Map的key

2.生成新的Map,反转key和value

- SortedMap和LinkedHashMap
1.SortedMap可以自动对key进行排序

2.LinkedHashMap可以记住插入entry的顺序

- Map的元素类型–Tuple
1.简单Tuple与访问

2.zip操作(拉链操作)
