本文共 2806 字,大约阅读时间需要 9 分钟。
Scala概念
Scala是一种多范式的,面向对象的和函数式编程的语言。Scala运行于jvm,并兼容现有Java程序
Scala优点
速度快:Scala代码比Java简洁,开发速度快
Spark实现语言:Hadoop是大数据标准,Spark完善Hadoop生态
Scala基础
1、声明变量
scala 中没有 static 关键字,scala object 中所有成员变量和方法默认都是 static 的
Scala声明变量两种方式,val和var
val / var 变量名 : 变量类型 = 变量值
val定义的值是不可变的,它不是一个常量,是不可变量
提示
1、scala默认为匿名变量分配val
2、为减少可变性引起bug,应尽可能使用不可变变量val
3、val定义的变量不能改变其引用的内存地址,但是可以改变其引用的对象的内部的其他属性值
常用类型
Scala和Java一样,有8种数据类型: 7种数值类型Byte、Char、Short、Int、Long、Float和Double(无包装类型)和一个Boolean类型,与Java中的数据类型不同,不区分基本类型和引用类型,这些类型都是对象,可调用相应方法
Boolean | true 或者 false |
Byte | 8位, 有符号 |
Short | 16位, 有符号 |
Int | 32位, 有符号 |
Long | 64位, 有符号 |
Char | 16位, 无符号 |
Float | 32位, 单精度浮点数 |
Double | 64位, 双精度浮点数 |
String | 其实就是由Char数组组成 |
常用类型结构图
Scala中,所有的类都最终继承自根类型Any,它有两个子类:AnyVal和AnyRef
Unit类型用来标识过程,即没有返回值的函数。 Unit类似于Java里的void。Unit只有一个实例(),它没有实质的意义
Null是所有引用类型AnyRef的子类型。Null类只有一个实例对象,null。null可以赋值给任意引用类型,但不能赋值给值类型
Nothing是所有类型的子类,也是Null的子类。Nothing没有实例对象,但可用来定义类型。例,如果一个方法抛出异常,则异常的返回值类型就是Nothing(虽然不会返回)
算数操作符重载
+ - * / 可以完成和Java中相同的工作,但它们都是方法。方法的使用方式是“实例对象.方法名(参数列表)”
1 + 2 等同于 1.+(2)
条件表达式
Scala的的条件表达式比较简洁
val z = if (x > 1) 1 else "error"
提示
scala中没有三目运算符,因为if else表达式是有返回值的
若缺少判断,什么都不返回,则返回Unit类的实例对象,()无用占位符,相当于java中的void
行尾的位置不需要分号,只要能够从上下文判断出语句的终止即可。但如果在单行中写多个语句,则需要分号分割
块表达式
Scala中,{}块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值
val result= {
1+2 4>5 }println(result)
循环
for 推导式约定:当for 推导式仅包含单一表达式时使用(),当其包含多个表达式时使用{}
(1)while表达式
While语句本身没有值,返回结果是Unit类型的
while循环
var n = 1
val w = while(n <= 10){
n += 1
}
println(w)
println(n)
(2)for表达式
for循环语法结构:for (i <- 表达式/数组/集合)
//1 to 3,Range为1,2,3//1 until 3,Range为1,2for(i <- 1 to 3){ println(i)}for(i <- 1 until 3) { println(i)}
说明:Scala没有break或continue语句来退出循环。如果需要break时有如下几个选择:
1、使用Boolean型的控制变量;
2、使用嵌套函数--你可以从函数当中return;
3、使用Breaks对象中的break方法:
//continue例子for (i <- 1 to 10) { Breaks.breakable{ if (i == 2) Breaks.break println(i) }}//break例子Breaks.breakable{ for(i<-1 to 10){ if(i==5){ Breaks.break } println(i) }}//可以认为breakable处理掉了break抛出的异常//retrunfor(i <- 1 to 10){ if(i==2) return println(i)}
倒序输出
//Range(起始,结束,步长)前闭后开for(i <- Range(10 , 1,-1)){ println("i = "+i)}for(i <- (1 to 10).reverse){ println("i = "+i)}
方法&函数
(1)定义方法
//def定义 方法名 参数列表 =分隔符 方法体
def m(x:Int,y:Int) = x+y println(m1(1,2))
(2)定义函数
//val var def 定义函数名 参数列表 =>分割符 方法体
var m2 = (x:Int,y:Int)=>x+y println(m2(1,2))
定义函数时,使用val、var、def都可以,函数原型与函数体的分隔符是=>,函数定义不能写返回值类型
(3)方法和函数的区别
案例:将函数作为方法的参数传入
def m1(x: Int, y: Int, f: (Int, Int) => Int): Int = {
f(x, y)
}
(4)将方法转换成函数(神奇的下划线)
def m1(x: Int, y: Int, f: (Int, Int) => Int): Int = { f(x, y) }
var m2 = m1 _ println(m2)
闭包
//方法的方法体是函数,方法的返回值是一个函数
def c1(more:Int) = (x:Int)=>x*moreprintln(c1(3))//返回值是只有一个参数的函数
println(c1(3)(4))
懒值
当val被声明为lazy时,它的初始化将被推迟,直到首次对此取值
def init():String={ println("emmm") "yes"}var x ="aaa"//val a = init()lazy val a = init()println(x)
转载地址:http://yvazi.baihongyu.com/