AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

Scala高频面试题

1. scala语言有什么特点?什么是函数式编程?有什么优点?

  • scala同时具有⾯向对象和函数式编程的多种编程范式。
  • 函数式编程是一种编程范式,主要思想就是将程序写成一系列函数嵌套的形式,让程序的条例更清晰,灵活性更强。

2. 什么是scala中的闭包?

  • 闭包(closure /ˈkloʊʒər/)
  • 闭包就是能够读取其他函数内部变量的函数。
val a = 3
def add(b:Int) = a + b
// add就是是一个闭包

3. 什么是scala中的纯函数?有什么好处?

  • 是什么
    • 纯函数(Pure Function /pjʊr/ /ˈfʌŋkʃn/)所有的输入通过参数传递到函数内部,所有的输出通过返回值传递到函数外部;
    • 闭包或者带有打印语句的函数为非纯函数。
  • 好处
    • 无状态,线程安全,不需要线程同步;
    • 纯函数相互调用组装起来的函数,还是纯函数;
    • 应用程序或者运行环境(Runtime)可以对纯函数的运算结果进行缓存,运算加快速度。
//纯函数  输入都来自参数  输出都通过返回值
def f1(a:Int,b:Int) = a + b
//非纯函数
val x = 1
// 输入变量x不是通过参数输入
def f2(y:Int) = x + y
// 除了返回值还包含打印语句
def f3(x:Int) = {
  println(x)
  x+1
}

4. 什么是scala中的模式匹配?

  • 类似java中的swich-case;
  • scala的模式匹配包括了⼀系列的匹配选项,匹配选项以关键字case为单位,每个匹配选项包括⼀个模式或多个表达式,如果匹配成功将执行或返回=>后面的表达式;
val x:Any = 1
val res = x match {
  case x:Int => "这是一个Int"
  case x:String => "这是一个String"
  case _ => "这是一个非Int,非String的对象"
}

5. case class和class的区别

  • case class是一个样例类;

    1. 样例类默认将主构造器的参数使用val声明,即作为类的成员属性;
    2. 样例类默认添加伴生对象和全参的apply方法,方便对象构建;
    3. 样例类默认添加伴生对象和全参的unapply方法,方便模式匹配和属性提取;
    4. 样例类默认实现了toString,equals,hashcode,copy⽅法;
  • class是一个不具有上述样例类特点的普通类

6. 什么是scala中的隐式转换

  • scala中通过implicit关键字修饰的变量、函数或者类,在调用时,不用显式书写调用过程的一种语法。

7. 什么是scala中的伴生类和伴生对象

  1. 在scala中,object与class名字完全相同,且声明在同一个scala源代码文件中,那么该对象被称为该类的伴⽣对象,该类被称为该对象的伴⽣类;
  2. 伴⽣对象和伴⽣类可以互相访问其私有成员。

8. scala和java的区别

区别 Scala Java
变量声明 scala:使用var或val声明,类型可以省略不写,编译器通过赋值自动推断类型 需要在变量前明确声明变量类型
返回值 可以省略return关键字,编译器根据代码块最后一行自动返回 需要显式使用return关键字
结束符 非必要使⽤分号作为结束符 必须使用分号作为语句结束符
循环 for中可以使用守卫,但没有continue和break关键字 没有守卫语法有continue和break关键字
通配符 _ *
构造器 主构造器直接跟在类的声明之后,辅助构造器命名为this,辅助构造器必须直接或间接调用主构造器 构造器名称与类名一致
内部类 scala实例化的内部类是不同的,可以使⽤类型投影,例如 Outer#Inner表示Outer的Inner类 内部类从属于外部类
接口 scala中接口称为特质(trait),特质中可以写抽象⽅法,也可以写具体的⽅法。且类可以实现多个特质;特质中未被实现的⽅法默认就是抽象的;⼦类的实现或继承统⼀使⽤extends关键字,如需实现或继承多个使⽤with关键字拼接;特质中可以有构造器特质可以继承普通的类,并且这个类称为所有继承trait的父类 java中的接口(interface),接口中的⽅法只能是抽象⽅法,不可以写具体包含⽅法体的⽅法;接口中不能有抽象的属性,且属性的修饰符都是public static final;类实现接口需要使⽤implements关键字,实现多个接口,需要用逗号隔开;接口中不可以有构造器;接口不可以继承普通的类
赋值 scala中的赋值语句返回结果是unit,不可以串联,例如x=y=1,x没有被赋值为1 x=y=1,这样没问题

9. 什么是scala的高阶函数

  • 一个函数作为其他函数的参数
  • 一个函数作为其他函数的返回值
//例如
//函数作为参数
def f1(f:Int => Int,x:Int) ={
  f(x)
}
//函数作为返回值
def f1(x:Int) : Int => Int ={
  (y:Int) => x + y
}

10. 隐式参数使用的优先顺序是什么

  1. 当前类声明的implicits ;
  2. 导入包中的 implicits;
  3. 外部域(声明在外部域的implicts);
  4. 继承的父类中的;
  5. 所属包对象中的;
  6. 伴生对象的以上作用域。

11. Option类型的定义和使用场景?

  • 在Java中, null是⼀个关键字,不是⼀个对象,当开发者希望返回⼀个空对象时,却返回了⼀个关键字,为了解决这个问题, Scala建议开发者返回值是空值时,使⽤Option类型,在Scala中null是Null的唯⼀对象,会引起异常, Option则可以避免。 Option有两个⼦类型, Some和None(空值)。

12. Unit类型是什么?

  • Unit代表没有任何意义的值类型,类似于java中的void类型,他是anyval的⼦类型,仅有⼀个实例对象"( )"

13. Scala类型系统中Nil, Null, None, Nothing四个类型的区别?

  • Null是⼀个trait(特质),是所以引⽤类型AnyRef的⼀个⼦类型, null是Null唯⼀的实例。
  • Nothing也是⼀个trait(特质),是所有类型Any(包括值类型和引⽤类型)的⼦类型,它不在有⼦类型,它也没有实例,实际上为了⼀个⽅法抛出异常,通常会设置⼀个默认返回类型。
  • Nil代表⼀个List空类型,等同List[Nothing]。
  • None是Option的一个实例,代表空结果集的返回。