scala知识点总结
👉什么是scala
Scala 是一门 以 Java 虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。
Scala是一门将Java的OOP设计思想和自身函数式编程的思想相结合而造就的静态类型编程语言。
👉为什么要学习 Scala
Spark 是新一代内存级大数据计算框架,是大数据的重要内容
Spark 是使用 Scala 编写的,为了更好的学习Spark,需要掌握 Scala
Spark 的兴起,带动 Scala 语言的发展。
👉scala 的特点
函数是头等公民
OOP和函数式编程:Scala 是一门多范式的编程语言,Scala 支持面向对象和函数式编程。
Scala 源文件
.scala
会被编译成Java字节码文件.class
,然后运行于JVM上,并且可以调用现有的Java类库,实现两种语言的无缝对接。Scala语法简单:Scala单作为一门语言来看,非常的简洁高效。
Scala源于Java:Scala在设计时,参考Java的设计思想,也有自己独有的函数式编程语言的特点。
👉scala和java 有什么区别?
Java | Scala | |
---|---|---|
语法特点 | 相对Scala,代码冗余,但易读性高 | 相对于Java,语法简单,但是易读性差 |
声明变量 | 数据类型 变量名 = 值 | var 变量名 = 值 |
声明常量 | 使用final关键字修饰 | val 常量名 = 值 |
方法三要素 | 修饰符 返回值类型 方法名(形参列表){方法体} | def 方法名(形参: 类型): 返回值类型={方法体} |
👉val 和var的区别?
语法:
[关键字] 变量名 [: 变量类型] = 变量值
共同点:两者都需要
初始化
,数据类型可以不指定,编译器会自动推导其类型。类型指定后,不能修改。不同点:
val 是声明常量的关键字,声明的常量不能被再次赋值。
var 是声明变量的关键字,声明的变量可以被再次赋值。
👉scala的数据类型?
Scala中一切数据皆对象,都是Any的子类,类似于Java中的Object。
Scala中的数据类型分为两大类:AnyVal(数值类型)、AnyRef(引用类型)
- AnyVal(值类型)
- 整数类型:Byte、Short、Int、Long
- 浮点类型:Float、Double
- 字符类型:Char
- 布尔类型:Boolean
- Unit类型、Null类型和Nothing类型
- AnyRef(引用类型)
- Scala Collections(集合)
- All java classes
- Other Scala classes
👉scala 运算符
算术运算符、关系(比较)运算符、逻辑运算符、赋值运算符、位运算符
算术运算符:+(正号,加,字符串拼接)、-(负号,减)、*(乘)、/(除)、%(取余)
关系(比较)运算符:==(相等)、!=(不等)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)
逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非)
赋值运算符:=(赋值运算符)、+=(相加后赋值)、-=(相减后赋值)、
*=(相乘后赋值)、/=(相除后赋值)、%=(取余后赋值)、
<<=(左移后赋值)、>>=(右移后赋值)、&=(按位与后赋值)
^=(按位异或后赋值)、|=(按位或后赋值)
位运算符:&(按位与运算符)、|(按位或运算符)、^(按位异或运算符)、
~(按位取反运算符)、<<(左移动运算符)、>>(右移动运算符)、
>>>(无符号右移)
👉scala块语句有什么特点?
组合几个表达式,使用
{ }
包围起来,即代码块。代码块中最后一个表达式的结果或一个值或者一个变量,即整个块的结果。
👉scala break使用?
导入Breaks类:
import scala.util.control.Breaks._
即可使用 break() 实现Java中break关键字的效果
// 导入break所在的包
import scala.util.control.Breaks._
object Demo {
def main(args: Array[String]): Unit = {
var a = 5;
while(a<10){
println(a)
if(a==8){
println(a+"跳出循环")
break()
}
a+=1
}
}
}
👉scala 函数和方法的区别?
为了完成某一功能的程序指令(语句)的集合,即函数
类中的函数称之为 方法
函数是带有参数的表达式
方法由
def
定义,def 后面跟着 方法名、形参列表、返回类型和方法体① 方法不能作为单独的表达式而存在(参数为空的方法除外),函数可以。
② 函数必须要有参数列表,而方法可以没有参数列表。
③ 方法名是方法调用,函数名代表函数对象本身。
④ 在需要函数的地方,如果传递一个方法,会自动进行ETA(把方法转换为函数)展开。
⑤ 传名参数本质上是个方法
👉scala 函数的参数?
可变参数:参数的个数可变,但是参数的数据类型必须是指定的类型
def test(s: String*): Unit = {
println(s)}
test("Hello","World","Hello","Scala")
// ArraySeq(Hello, World, Hello, Scala)
def test(s:Any*): Unit = {
println(s)}
test("Hello","World","Hello",2,2.5)
// ArraySeq(Hello, World, Hello, 2, 2.5)
如果参数列表中存在多个参数,那么可变参数一般放置在最后。
def test2( name : String, s: String* )
{
println(name + "," + s)
}
test2("汤姆","是个","男孩")
// 汤姆,ArraySeq(是个, 男孩)
参数可以设置默认值,在调用函数的时候,不给其传值,会使用默认值。
def test3(id: Int,name: String,gender: String ="男")=
{
println(id+"\t"+name+"\t"+gender)
}
test3(2,"李四")
// 2 李四 男
带名传参,通过参数名称=值的方式,可以不按照参数列表的顺序传值。
def test4(id: Int,name: String,age: Int)={
println(id+"\t"+name+"\t"+age)}
test4(name="张三",id=4,age=18)
// 4 张三 18
👉scala 方法的几种写法?
// 无参无返回值
def test{
println("无参无返回值")
}
test // 无参无返回值
// 无参有返回值
def test1: Int={
println("无参有返回值")
25
}
println(test1) // 无参有返回值 // 25
// 有参无返回值
def test2(name: String){
println(name+"有参无返回值")
}
test2("王五") // 王五有参无返回值
// 有参有返回值
def test3