scala
-
scala介绍
- 是一个编程语言 多范式 面向对象编程(OOP) 函数式编程(FP)
- scala是一个运行于jvm平台的语言 最终需要编译成字节码文件运行于jvm
- scala和java api无缝调用
-
scala 优点
- 语法灵活 优雅 简洁 速度快
-
scala sdk的安装
-
注意windows平台和linux平台之间的差异性
-
windows
SCALA_HOME=C:\Work\soft\scala-2.11.8 PATH=;%SCALA_HOME%\bin
-
linux
export SCALA_HOME=/export/servers/scala-2.11.8 export PATH=$PATH:$SCALA_HOME/bin
-
-
scala开发插件
- 推荐在线插件安装
scala基础语法
-
常量、变量
-
常量指的是程序运行中不要修改变化的量 用val修饰
-
变量指的是程序运行中需要修改变化的量 用var修饰
val 常量名 :类型 = 值 var 变量名 :类型 = 值 scala中名称在前 类型在后 大多数时候 类型可以省略不写 scala编译器可以自动推导
-
-
数据类型
-
种类和java一样 大小写敏感
-
在scala中 数据类型本质都是对象 因此基于数据类型的+ - * / 操作都是对象的方法
scala> 1 + 1 res0: Int = 2 scala> 1.+(1) res1: Int = 2
-
-
条件表达式
-
语法比java更加灵活 {}如果只有一个表达式 可以省略不写
-
支持混合类型表达式
val b = if (a > 1) 1 else "allen"
-
-
Any
- 在scala中 Any是所有对象共同父类 超级父类 所有类都是其子类
- Any有两个直接子类
- AnyVal 所有基本类型的父类
- AnyRef 所有引用类型的父类
-
scala Unit
- 在scala 中Unit表示空 相当于java中void Unit有一个唯一的实例 ()
-
代码块
- 用{}括起来的一段代码逻辑称之为代码块
- 代码块的执行的结果是最后一个表达式的结果
-
to 方法
1 to 10 res4: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 返回一个含头含尾的区间range 1 until 10 scala> 1 until 10 res33: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9) 返回一个含头不含尾的区间
-
for循环
-
格式
for (形式参数 <- 表达式|数组|集合) scala> val a1 = Array(11,12,13) a1: Array[Int] = Array(11, 12, 13) scala> for(i <- a1) println(i)
-
for推导式
在for加上yield关键字 关键字后面跟上表达式 可以把表达式作用于for循环结果 返回构成一个新的集合
a1: Array[Int] = Array(11, 12, 13) scala> for (i <- a1) yield i * 10 res6: Array[Int] = Array(110, 120, 130)
-
-
方法的定义
-
识别方法的重点是关键字 def
-
格式
def 方法名(参数名1:类型,参数名2:类型...):返回类型 = {方法体}
-
注意事项
-
针对返回结果类型 通常情况下可以不写 但是递归方法除外 需要指定返回结果类型
-
针对方法体 如果逻辑简单 {}可以省略不写
-
针对输入参数列表 如果是无参数输入 ()也可以省略不写
def sayHello = println("hello")
-
-
-
函数的定义
-
识别函数的重点是 =>
-
格式
val 函数名称 = (参数名1:类型,参数名2:类型...) => {函数体} scala> val f1 = (x :Int,y :Int)=> x + y f1: (Int, Int) => Int = <function2> scala> f1(1,2) res16: Int = 3
-
注意事项
- 如果没有常量或者变量引用 函数称之为匿名函数
- 函数体简单 可以{}省略不写
- 也可以定义无参数函数
-
-
方法和函数的区别
-
在函数式编程语言中 函数是头等公民
-
函数本身是对象 具有自己的方法 每个函数都是FunctionN的实例 N表示函数的参数个数
andThen apply compose toString
-
函数可以当做成其他数据类型 一样 作为参数传递给方法
-
通常情况下 使用匿名函数作为参数传递
scala> def m1(x:Int,y:Int) = x+y 普通方法 接受两个int类型参数 返回一个int m1: (x: Int, y: Int)Int scala> def m2(f:(x:Int,y:Int)=>Int)=f(2,3) 定义格式错误 <console>:1: error: ')' expected but ':' found. def m2(f:(x:Int,y:Int)=>Int)=f(2,3) ^ scala> def m2(f:(Int,Int)=>Int)=f(2,3) 特殊方法 接受一个参数 类型为函数 m2: (f: (Int, Int) => Int)Int 且要求是输入两个int 返回一个int的函数 scala> val f1 =(x:Int)=>x+1 函数:接受一个int 返回一个int f1: Int => Int scala> val f2 =(x:Int,y:Int)=>x+y 函数:接受两个int 返回一个int f2: (Int, Int) => Int scala> m2(f2) f2符合m2的参数类型 就可以把函数作为参数传递给方法 res0: Int = 5 scala> m2((x:Int,y:Int)=>x+y) 以匿名的形式传递给方法 res1: Int = 5
-
方法可以转化成为函数 神奇的下划线
scala> def m2(f:(Int,Int)=>Int)=f(2,3) m2: (f: (Int, Int) => Int)Int scala> def m1(x:Int,y:Int) = x+y m1: (x: Int, y: Int)Int scala> m1 _ res6: (Int, Int) => Int = <function2> scala> m2(m1 _) res7: Int = 5 scala> m2(m1) 使用隐式转换把方法变成函数 res8: Int = 5 相当于: scala> val f1 = m1 _ 先把m1方法转化成为函数f1 f1: (Int, Int) => Int = <function2> scala> m2(f1) f1作为参数传递m2 res9: Int = 5
-
数组Array
-
scala中数组分为定长数组Array 变长数组ArrayBuffer
-
所谓的长指的是长度是否可以发生改变
-
不管是定长还是变长 创建的时候有两种方式 有初始值 没有初始值
-
定长数组Array
val a1 = Array(元素1,元素2,元素3,元素4) 不需要new 底层调用apply方法帮我们new val a2 = new Array[元素类型](数组长度)
-
变长数组ArrayBuffer(使用前需要导包 import scala.collection.mutable.ArrayBuffer)
val a3 = ArrayBuffer(元素1,元素2,元素3,元素4) 不需要new 底层调用apply方法帮我们new val a2 = new ArrayBuffer[元素类型]
-
-
变长数组操作
增加元素 a1 += 元素 a1.append(元素) 删除元素 a1 -= 元素 a1.remove(元素的角标)
-
遍历数组
for循环遍历 for(a <- a3) println(a)
-
集合
-
Map映射
-
Map分为可变map和不可变Map 默认情况下是不可变Map
-
定义格式是完全一样的 区别导包的差异
-
定义格式
val m1 = Map(k1 -> v1,k2 -> v3,k3 -> v3) val m2 = Map((k1,v1),(k2,v2),(k3,v3))
-
map操作
-
针对不可变Map
获取值: m1(k1) = v1 m1.get(k1) = v1 m1.getOrElse(k1,默认值) m1.keySet m1.Keys
-
针对可变Map
手动导包import scala.collection.mutable.Map
查看操作和上述不可变的一样 元素值的修改: m1(k1) = 新k 增加元素 m1 += (k3->v3) m1 += ((k3,v3)) 删除元素:只需要指定key就可以 m1 -= (k1) m1.remove(k1)
-
map遍历
for(i <- m1.Keys) println(m1(i)) for循环遍历 for((x,y) <- m1) println(x+"---->"+y) 模式匹配遍历 重点掌握
-
-
-
Tuple 元组
-
不同类似数据的聚集 用小括号把一堆不同类型的数据括起来
-
如果元组只有两个元素 称之为对偶元组 map映射是对偶元组的集合
-
定义格式
val t1 =(元素1,元素2,元素3) scala内置了22个TupleN对象 可以直接new TupleN对象创建元组 val t2 = new Tuple3(元素1,元素2,元素3)
-
元组数据的获取
_1 _2 _3 下标是从1开始的
-
元组的遍历
Tuple.productIterator() 获取迭代器 进行遍历
-
-
列表List
-
分为两大类 不可变List 和可变ListBuffer
-
定义格式
-
不可变List
val l1 = List(元素1,元素2)
-
可变listBuffer import scala.collection.mutable. ListBuffer
val l2 = ListBuffer[Int](元素1,元素2)
-
特殊符号
- head 返回集合的一个元素
- tail 返回的是除了第一个元素之外其他所有元素构成的集合
- Nil 表示的是一个空集合 List()
-
-
列表的操作
针对不可变List +: 在集合的头部添加元素 scala> 10 +: l1 res68: List[Int] = List(10, 11) scala> l1.+:(10) res72: List[Int] = List(10, 11) :: 在集合的头部添加元素 scala> 10 :: l1 res74: List[Int] = List(10, 11) :+ 在集合尾部添加元素 scala> l1 :+ 10 res76: List[Int] = List(11, 10) scala> l1.:+(10) res77: List[Int] = List(11, 10) 针对可变ListBuffer 元素增加 += append 元素删除 -= remove scala> l1 += 14 res82: l1.type = ListBuffer(11, 12, 13, 14) scala> l1 res83: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 12, 13, 14) scala> l1.append(15) scala> l1 res85: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 12, 13, 14, 15) scala> l1 -= 12 res86: l1.type = ListBuffer(11, 13, 14, 15) scala> l1 res87: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 13, 14, 15) scala> l1.remove(2) res88: Int = 14
-
-
Set集合
-
分为两大类 可变Set 不可变Set 默认情况下是不可变的
-
针对可变的Set 需要自己手动导包 import scala.collection.mutable.Set
-
定义格式
val s1 = Set(元素1,元素2)
-
特点: 元素不重复(去重) 元素无序(没有角标概念)
-
操作
+= add -= remove 注意remove是通过元素移除的
-
面向对象
-
对象
-
class 普通对象 需要new 获取对象的实例 通过实例调用对象的属性和方法
-
object 全局唯一实例对象 不需要new 里面方法和属性都是静态的 直接类名.方法 类名.属性
-
通常把main方法写在object中 作为程序的入口
def main(args :Array[String]):Unit ={ }
-
-