[Scala02]Scala中的类型体系
1、变量(variable):
val 定义 immutable variable
var 定义 mutable variable
lazy val 定义惰性求值的immutable variable
#变量可以不显示的指定类型,scala足够聪明,会自动进行类型推导
#lazy val的使用场景:该表达式不会马上用到,或者表达式的计算需要消耗大量的网络资源
scala>var x:Int =10
>x : Int=10
scala>var y =20
>y : Int =20
#以上两种定义变量的方式都可以
scala>x+y
>res0 : Int =30
#res0、res1、res2、、、是scala为没有变量名的表达式默认取的变量名
scala>lazy val z = y-x
z : Int = <lazy>
#没有立即求解出z的值
scala>f*10
>res1 : Int =100
#第一次使用到f的时候进行求值
2、scala类型体系:
1)scala的根类叫做Any,它有两个子类:AnyVal和AnyRef,AnyVal所有值类型的父类,AnyRef是所有引用类型的父类
2)AnyVal有四个子类:Numeric types、Boolean、Char、Unit。Numeric types为数值类型、Boolean为布尔型、Char字符类型、Unit空类型(相当于java和c语言里的void)。
3)AnyRef有两部分组成:所有java中的引用类型、所有scala自定义的类。
4)Null是所有引用类型的最后一个子类,Nothing是所有scala类型的最后一个子类。
5)Unit常作为函数返回值类型出现,函数不返回任何值,这表明函数具有副作用
6)scala>val a :Unit=()
>a :Unit=()
scala>val b=()
>b :Unit=()
3、Null和Nothing
Null表示引用类型的值为空,但在scala中我们这种场景下通常不使用Null,使用Option
Nothing表示程序异常终止。对于一个函数而言,如果返回值是Nothing,表明函数发生了异常。
scala>def foo=throw new Exception("error occurred")
>foo : ()Nothing
4、String
scala中的String和java中的String一样,但是scala新增了一个字符串插值的特性
scala>val a ="xiaoming"
>a : String =xiaoming
scala>val b=s"my name is ${a}"
>b : String =my name is xiaoming
5、代码块的两种表现形式
{表达式1;表达式2;.......}
#若花括号内只有一个表达式则花括号可以省略
{
表达式1
表达式2
..........
}
#代码块的作用是组织多个表达式,但代码块本身也是一个表达式,它的值等于最后一个表达式的值
6、函数
def functionName(参数1:参数类型,参数2:参数类型,........):函数返回值类型={
代码块
}
#函数可以不写返回值类型,scala会自动推导出返回值类型
def functionName(参数1:参数类型,参数2:参数类型,........)={
代码块
}
7、简单的代码
Object func_examples{
def hello(name:String):String={
s"hello,${name}"
}
hello("xiaoming")
def hello(name:String)={
s"hello,${name}"
}
hello("xiaoming")
def add(x:Int,y:Int)=x+y
add(1,2)
}
##################################################
以上运行结果:
res0:String=hello,xiaoming
res1:String=hello,xiaoming
res2:Int=3
8、if表达式
if(逻辑表达式)valueA else valueB
#逻辑表达式结果为真,返回valueA,为假返回valueB
举例:
scala>if(true) 1 else 2
>res0 : Int = 1
scala>val a=1
>a : Int = 1
scala>if(a==1) a
>res2 : AnyVal = 1
scala>if(a!=1) "not one"
>res3 : Any=()
scala>if(a!=1) "not one" else a
>res0 : Any = 1
9、for表达式
Object work_sheeet{
val a=List("alice","bob","cathy")
for(s<-a
//这行代码会将a中的值逐一赋给s
)println(s)
for(s<-a
if(s.length>3)
)println(s)
val result_for=for(s<-a
s1=s.toUpperCase()
)yield(s1)
//yield(s1)会将逐一得到的s1的值放到一个集合中去
}
运行结果:
>alice
|bob
|cathy
>alice
|cathy
>result_for:List[String]=List(ALICE,BOB,CATHY)
10、try表达式
try{ Integer.parseInt("dog")
//将“dog”转成Int型
}catch{
case _=>0
//_为通配符,表示任何对象。上面代码表示无论遇到怎样的异常都返回0
}finally{ print("alway be printed")
}
//finally语句中的内容总是会被执行,无论try块中是否抛出异常
11、match表达式
Object work_sheeet{
val code=1
val result_match=code match{
case 1=> "one"
case 2=> "two"
case _ => "others"//_为通配符,表示任何对象。
}
运行结果:
result_match:String=one