Scala编程语言面试基础篇1
Scala和java前世今生:
Scala运行在java虚拟机上,并且兼容现有的java程序;Scala源代码被编译成Java字节码,所以它可以运行在JVM上,并且可以调用Java类库。
以下几点有java基础的话对比起来更好理解哦~~~
Scala特性:
(1)Scala修饰符:var val
var 声明的变量值可以改变,编译后对应的set()\get(),同java中public类似。
val 声明的变量不可以改变(值和址),类似于final关键字修饰的变量。
代码:
var iRetCode: Int = RetMsg.RTMSG_OK
val clFeeCalReqData: FeeCfgManObject = new FeeCfgManObject()
iRetCode = clFeeCalReqData.load()
if (iRetCode != RetMsg.RTMSG_OK)
{
return iRetCode
}
val clBroadcast: Broadcast[FeeCfgManObject] = p_clContext.getSparkSession.sparkContext.broadcast(clFeeCalReqData)
(2)包scala.collection.mutable 和包scala.collection.immutable
拿map举例,scala中有两种Map,分别来自上面的可变集合包和不可变集合包。
var 不可以修饰不可变map,默认创建map的时候都是创建不可变map。
但是,程序中一般要创建的都是可变map,所以map引入的时候要加mutable.map
不可变包里面的集合在更新值得时候会返回一个新的集合,
比如,如果不可变map在更新值得时候put后会返回一个新的Map,但是可变map修改其值得时候,将会直接修改原map
所以在程序开发的时候下面能替换的集合尽量用可变包里面的 ,比如scala.collection.immutable.ListList=>ListBufferscala.collection.mutable.ListBuffer
(3)Scala中的伴生对象和伴生类
Scala中伴生对象本质就是生成静态属性
特点就是伴生类和伴生对象之间可以相互访问私有方法和属性
条件是在一个scala文件中object和class命名相同。
a.弥补scala语言类Class中不能定义静态static属性的缺陷;
b.节省内存资源,因为静态属性属于java类,在整个JVM中只开辟一块内存空间,使得静态属性很节省内存资源;
c.资源共享,因为静态属性在JVM中只有一块内存空间所以我们可以在所有实例中共享这一块内存里面得信息。
(4)Scala访问修饰符
private【this】只能在定义的类中访问,加this伴生对象也不能访问
private【scala】 在定义的类中;加【scala】scala包以及子包中可以访问
private 在定义的类和伴生对象中可以访问
protected:在定义的类以及子类中访问,伴生对象可以访问
public:不加就是public,包和包之间可以调用
(5)Scala中trait特质
Scala中没有interface ,可以将trait理解成interface,Scala中没有impliments概念,都是通过extends实现。
普通类继承特质trait,实现特质中抽象方法的时候可以不加ovrride关键字
继承trait后必须实现特质的抽象方法和属性,实现时可以不加ovrride关键字
Scala支持类的多继承,支持继承多个trait,多个trait之间用with连接
(6)Scala中模式匹配match case;Java中是 switch case
(7)
Scala中的柯里化(currying) ,即原来接收两个参数的函数变成一个新的只有接收一个参数的过程类似于:
f(y) = f(x)*y ;
Scala中的函数闭包:val aa: Int = 100
val f = (i: Int) =>
{
i * aa // 返回值依赖于函数外的变量,这就是一个简单的闭包函数
}
此外还有偏函数、上下边界、隐式转换这些概念,我们下次聊~~~