Scala
1.Scala与Java对比
Scala的特色:
1.优雅:一行代码相当于Java的多行代码
2.速度快:静态编译
3.spark依赖于Scala,所以Scala能更好的融合Hadoop生态圈
4.以jvm为基础运行,兼容Java
对比表格
Java | Scala | |
---|---|---|
1.字符串 | “”"…\n…""" 采用三对双引号支持字符串换行 | “str1”+"str2"采用+进行字符串拼接 |
2.返回值 | return var 采用return 进行返回 | 默认返回最后一行表达式的值,如果使用return需要显示指定方法的返回值 |
3.访问修饰符 | 默认为protect | 默认为public |
4.默认导入的包 | java.lang.* | java.lang.* scala scala.Predef |
5.数据类型 | Java作为不纯粹的op包含了基本类型+引用类型 | 全部引用类型 |
6.static | 支持静态 | 不支持静态 |
7.范式 | 支持OOP | 支持OOP+函数式编程 |
8.接口 | interface | trait |
9.OOP | 类和对象需要自己定义和实现 | 支持单例对象、伴生对象和伴生类 |
9.方法的调用 | ()表示调用 | 调用无参方法时的可以省略 |
2.Scala的变量与数据类型
数据类型 | 描述 |
---|---|
Byte | 8为有符号补码整数,[-128,128) |
Short | 16为有符号补码整数,[-32768,32768) |
Int | 32为有符号补码整数,[-2147483648,214748364) |
Long | 64位有符号补码整数,[-9223372036854775808,9223372036854775808) |
Float | 32 位, IEEE 754 标准的单精度浮点数 |
Double | 64 位 IEEE 754 标准的双精度浮点数 |
Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
String | 字符序列 |
Boolean | true或false |
AnyVal | 所有基础类型的父类 |
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 |
Null | null或空引用,不兼容值类型 |
Nothing | Nothing类型在Scala的类层级的最底端;它是任何其他类型的子类型。 |
Any | Any是所有其他类的超类 |
AnyRef | AnyRef类是Scala里所有引用类(reference class)的基类 |
Tuple1~22 | (1,…,22)最多22个允许不同类型元素的 |
变量的声明
1.不指定类型直接赋值
var var1 = 5;
val val1 = 6;
此时var1和val1的类型由值的类型确定,确定后不再改变
2.指定类型
var var1:String = "xyz";
val val1:String = "abc";
注:
Tuple的声明和输出
var e:Tuple2[Int,String] = (1,"henry")
println(s"${e._1}\t${e._2}")
特殊写法
var a,c=6 a和c值都为6
3.控制台输入输出
1.输出
常规输出可以用print()或者println()方法直接输出就可以
var x = 10;
var y = "yugfc";
var z = 3.1415926;
println(x)
print(x);
而println()方法可以同时输出两个结果
println(s"${x}\t${z}")
格式化输出方法printf()不指定格式的场合即只写变量只能输出String类型常量或者变量,指定格式的场合按照如下格式
var x = 10;
var y = "yugfc";
var z = 3.1415926;
printf(y);
printf("{x:%d,y:%s,z:%f}",x,y,z)};
2.控制台输入
1)Console.readline()
var a = Console.readline();
2)BufferedReader
val br = new BufferedReader(new InputStreamReader(System.in));
var a = br.readLine();
3)Stdin同1)
4.运算符
算术:不支持 ++|–
关系:同java
逻辑: 同java
赋值:=
不支持三目运算符
5.分支结构
1.if分支结构
Scala同样具有单分支、双分支和多分支,基本结构同Java
2.模式首位和模式匹配替代了switch-case
1)简单匹配
var dial = 7;
var t = dial match {
case 1=>"充值"
case 2=>"余额"
case 3=>"人工"
case _=>"其他"
}
println(t)
2)if守卫
var score = 88;
var level = score match {
case _ if(score>=90)=>"A"
case _ if(score>=80)=>"B"
case _ if(score>=60)=>"C"
case _=>"D"
}
println(level)
3)模式首位
val rMail = ".*@\\w+\\.(com|cn|net|org)".r
val rPhone = "1[3-8]\\d{9}".r
val rPid = "\\d{17}(\\d|x)".r
var cnt = "aa@qq.com"
println(cnt match {
case rMail(cnt)=>"mail"
case rPhone(cnt)=>"phone"
case rPid(cnt)=>"pid"
case _ => "unknown"
})
3.样例类匹配
//1.创建样例类
case class PubMsg(t:String,msg:String) extends Message(t,msg)
case class ToMsg(t:String,to:Array[String],msg:String) extends Message(t,msg)
case class PriMsg(t:String,to:String,msg:String) extends Message(t,msg)
//2.创建样例类对象
var msg1:Message = PubMsg("1","hello")
var msg2:Message = ToMsg("2",Array("henry","pola"),"world")
var msg3:Message = PriMsg("3","ariel","world")
//3.使用match...case表达式进行匹配
println(msg3 match {
case PubMsg(t,msg) => "PUB"
case ToMsg(t,toList,msg) => "TOS"
case PriMsg(t,to,msg) => "PRI"
})
println(msg3 match {
case _:PubMsg => "PUB"
case _:ToMsg => "TOS"
case _:PriMsg => "PRI"
})
6.循环结构
1.while循环
同Java
2.do…while循环
同Java
3.for循环
//i∈[min,max]
for(i<-min to max){}
//i∈[min,max)
for(i<-min until max){}
//循环嵌套i为外层循环j为内层循环
for(i<-min to max;j<-min to max){}
//if相当于continue
for(i<-min to max;if...;if...){}
//集合的输出(Collection换成Array就是输出数组)
for(i<-Collection){}
//将i放到value集合中
val value = for(i<-min to max;if...;if...) yield i