什么是Scala
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序
Scala特性
- 面向对象特性
①每个值都是对象
②对象的数据类型和行为由类(Class)和特征(Trait)描述
③利用特征实现混入式多重继承 - 函数式编程
①每个函数都是一个值
②支持高阶函数、柯里化(currying)、样例类(case class)及模式匹配等 - 静态类型语言
- 扩展性:隐式类、字符串插值
Scala基础语法
变量和常量
- 变量:赋值后可以改变,生命周期可以被多次赋值
var 变量名:类型=值
- 常量:复制后不可变,类似于java中的final变量
val 常量名:类型=值
- 使用类型别名定义变量
type 类型别名=类型
示例:
在scala命令行中运行
// 变量
var i = 10 // i: Int = 10
i = 11 // i: Int = 11
// 常量
val j = 10 // j: Int = 10
j = 11 // error: reassignment to val
// type关键字
type z=String // defined type alias z
val str:z="lisi" // str: z = lisi
val str = "lisi" // 此句等同于上述两句
Scala关键字
Scala数据类型
Scala与java有着相同的原始数据类型
数据类型 | 描述 |
---|---|
Byte | 8位有符号整数。数值区间-128 ~ 127 |
Short | 16位有符号整数。数值区间-32768 ~ 32767 |
Int | 32位有符号整数。数值区间 -2147483648 ~ 2147483647 |
Long | 64位有符号整数。 -9223372036854775808 ~ 9223372036854775807 |
Float | 32位IEEE 754 单精度浮点数 |
Double | 64位IEEE 754 双精度浮点数 |
Char | 16位无符号Unicode字符。区间值为U+0000 ~ U+FFFF |
Boolean | true或false |
String | 等于java.lang.String |
Scala数据类型层次结构
Any:所有类型的超类(顶级类型)
AnyVal:表示值类型的超类
AnyRef:表示引用类型的超类,对应java.lang.Object
Unit:表示无值,类似Java中的void
Nothing:所有类型的子类
Null:表示null或空引用,null是Null类型的唯一实例
字符串插值
- s插值器:允许将变量引用、表达式直接插入字面字符中
val name="lisi"
println(s"Hello,$name") //Hello,lisi
println(s"1+1=${1+1}") //1+1=2
- f插值器
val height=456.23d
val name="lisi"
print(f"$name%s is $height%2.2f meters tall"))
2.2f含义代表:第一个2代表位数(包含小数点),当总位数超过时无影响,小于时用空格填补;后一个二代表保留小数位数,四舍五入,不足补0
- raw插值器
print(s"a\nb") //将输出换行符
print(raw"a\nb") //输出原始字符
Scala条件控制
- if语句
object Demo1 {
def main(args: Array[String]): Unit = {
val a=10
if(a>10){
println(a+"大于10")
}else if(a==10){
println(a+"等于10")
}else{
print(a+"小于10")
}
}
}
上述语句可以简写为:
val i = 10;
val b = if(i==10) i+"等于10" else if(i>10) i+"大于10" else i+"小于10"
println(b)
Scala循环控制
- while循环
object HelloWorld {
def main(args:Array[String]):Unit={
var x=0
while(x<=10){
println(x)
x=x+1
}
}
}
- do-while循环
object HelloWorld {
def main(args:Array[String]):Unit={
var y=0
do{
println(y)
y=y+1
}while(y<=10)
}
}
- for循环
val num:Int = 10;
for ( i: Int <- 1 to num )
{
println( i * 100 );
}
for { i: Int <- 1 until 100 by 2}
{
val y = 2*i;
println( y );
}
其中to和until都表示创建一个区间Range,但是to包含该值,until不包含;by代表步长,及i每次加2
- 中断
在scala中使用break需要导包
// 方式一
import scala.util.control.Breaks._
var num=10
breakable{
for(x<-num to 1 by -1){
if(x<3) break
println(x)
}
}
// 方式二
import scala.util.control.Breaks._
var num=10
val loop=new Breaks
loop.breakable(
for(x<-num to 1 by -1){
if(x<3) loop.break
println(x)
}
)
- for循环过滤
// 多个条件使用分号分隔
val num:Int = 10;
for ( i: Int <- 1 to num; if i%2==0;if i>5 )
{
println( i * 100 );
}
- for循环返回值
object Demo3 {
def main(args: Array[String]): Unit = {
val i = 100
val result = for(x<- 1 to i;if x%2==0;if x%5==0 ) yield x
for(i <- result){
println(i)
}
}
}
for 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合