scala基础
scala是一门多范式的编程语言,一种类似java的编程语言,以JVM为目标环境,将面向对象和函数式编程有机的结合在一起
应用:spark大数据开发
1、声明值和变量
关键字 val 和 var
val定义的值是常量,不可改变;var定义的是变量,可以改变 (声明值或者变量不初始化会报错)
_表示通配符,和java中 * 一样
scala中没有静态方法,但是有个类似的特性,叫做单例对象,通常一个类对应有一个伴生对象,其方法和java中静态方法一样。例如BigInt类的伴生对象有一个生成一个指定位数的随机素数的函数probablePrime
BigInt.probablePrime(100,scala.util.Random)
在scala中,没有参数且不改变当前对象的方法,可以通常不使用括号: "hello".distinct 获取字符串中不重复的字符
声明的时候可以不指定变量类型:val a = "hello",也可以声明的时候指定类型 val a: String = "hello" ,scala中,变量或者函数的类型在变量名或者函数名之后def main(args: Array[String]): Unit = {
}//Unit类似java中的void类型
scala中可以将多个值和变量放在一起声明
var greeting,message :String = "hello"
2、常用类型
scala中有七种数值类型 Byte 、Char、Short、Int、Long、Float、Double,以及一个Boolean类型,和java中不同的是,scala中这些类型都是类,scala中没有基本数据类型和引用类型区分
1.to(10) 产生 Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)// 1调用方法 to()
在scala中,没有包装类型,在基本类型和包装类型之间的转换是由scala编译器的工作。scala用底层的java.lang.String类来表示字符串,但是它通过StringOps类给字符串追加了上百种操作
输出两个字符串相同的一组字符
"hello".intersect("World") //输出 'lo' 两个字符串相同的字符
同理 RichInt 、RichDouble、RichChar给Int、Double、Char提供了很多便捷的方法
3、运算和操作符重载
scala的运算操作符合java中效果是一样,但是需要注意的是在scala中,操作符是方法,a+b 其实是 a.+(b),+是方法名
和java或者C++比较,scala中没有 ++ 或者 --这样的自增自减操作符,scala自增自减: a+= 和 a-=
4、调用函数和方法
scala中没有静态函数,在使用数学函数的时候,不需要从某个类中调用静态方法,只需要引入包,直接调用即可,在scala程序中引入数学函数 import scala.math._
_表示通配符,和java中 * 一样
scala中没有静态方法,但是有个类似的特性,叫做单例对象,通常一个类对应有一个伴生对象,其方法和java中静态方法一样。例如BigInt类的伴生对象有一个生成一个指定位数的随机素数的函数probablePrime
BigInt.probablePrime(100,scala.util.Random)
在scala中,没有参数且不改变当前对象的方法,可以通常不使用括号: "hello".distinct 获取字符串中不重复的字符
5、条件表达式
在java中,表达式和语句是不同的东西,表达式(3+4)有值,语句(if语句)是执行动作,但是在scala中,表达式和语句都有值
val s = if(x>0) 1 else -1
在scala中,每个表达式都有一个类型,val s = if(x>0) 1 else -1的两个分支的类型都是Int,val s = if(x>0) "positive" else -1 是混合类型表达式,这个表达式的类是两个分支类型的公共超类型。如果else语句缺失了,scala中的解决方案是引入Unit类 (类似java中的void),写作(),不带else的语句等价于 val s = if(x>0) 1 else ()
scala中没有switch语句
6、块表达式 和 赋值
在scala中,{ }包含一系列表达式,其结果也是一个表达式,块中最后一个表达式的值 就是块的值
val distance = {val dx=x-x0;val dy=y-y0; sqrt(dx*dx+dy*dy)}
赋值动作是没有值的(严格说是Unit类型),一个以赋值语句结尾的块表达式的值是Unit类型的,因此在scala我们不能赋值动作不能串在一起 x=y=1(因为y=1的值为 Unit类型)
7、循环
scala中while循环和java相同,scala没有和java中类似的for循环,scala中for循环
for( i <- 表达式)
for(i <- 0 to n) // 0 to n 等价于 0.to(n),返回 0到n(包含n)的Range区间
r=r*i
对于遍历数组需要使用0~n-1的区间,使用表达式 方法until
for(i <- 0 until n) // 0 to until 等价于 0.until(n),返回 0到n(不包含n)的Range区间
r=r*i
高级for循环和for循环推导式
以 变量<-表达式 的形式提供多个生成器,用分号隔开
for(i<- 1 to 3;j<- 1 to 3) print((10 * i +j) + " ") //11 12 13 21 22 23 31 32 33
每个生成器可以带一个守卫(以if开头的Boolean表达式)
for(i<- 1 to 3;j<- 1 to 3 if i!=j) print((10 * i +j) + " ") //12 13 21 23 31 32
如果for循环的循环体以yield开始,该循序体会构造出一个集合,每次迭代生成集合中的一个值
val vect = for(i <- 1 to 10) yield i%3 println(vect.toString()) //Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)
这类循环称为for的推导式,for推导式生成的集合与第一个生成器的类型兼容
val c1 = for(c <- "hello";i <- 0 to 1) yield (c+i).toChar println(c1) \\hieflmlmop val c2 = for(i <- 0 to 1;c <- "hello") yield (c+i).toChar println(c2) \\Vector(h, e, l, l, o, i, f, m, m, p)