vlambda博客
学习文章列表

scala-从入门到精通

1.scala中Unit是什么类型?

Unit类型类似于Java中的void类型,代表没有任何意义的值类型。


2.scala中的option是什么?
Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。如果option返回some的时候代表有值,如果返回的是None,则代表没有值。

如下例子:


3方法和函数的区别?


方法是定义在类中的函数,这个类进行实例化后会有一个同名的方法,一般调用方法的做法是使用缀点记法-实例名.方法名(参数……)


4说说你对闭包的理解?


简单的理解就是:函数内部的变量不在其作用域时,仍然可以从外部进行访问。一般的构成是在嵌套函数中,内部的函数体可以访问外部函数体的变量,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。


5什么是函数柯里化?


柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有的第二个参数作为参数的函数,所以科里化是一种返回函数的函数,目的是简化参数,是函数编写更加简洁和趋向自然语言。

 

def mulNormal(x:Int,y:Int) = x * y  //该函数每次执行需要两个参数

def mulOneAtTime(x:Int) = (y:Int) => x * y  //该函数先接受一个参数生成另外一个接受单个参数的函数



6 object和class的区别?


1)object是类的单例对象,开发人员无需用new关键字实例化

2)object不能提供构造器参数,也就是说object必须是无参的。

3)main方法只能在object中有效,Scala 中没有 static 关键字,对于一个class来说,所有的方法和成员变量在实例被 new 出来之前都是无法访问的因此class文件中的main方法也就没什么用了,而object中所有成员变量和方法默认都是static的,所以object中可以直接访问main方法。

 


7 什么是伴生对象和伴生类?


在Scala中,单例对象object与class名称相同时,该对象被称为该类的伴生对象,该类被称为该对象的伴生类。伴生类和伴生对象要处在同一个源文件中,伴生对象和伴生类可以互相访问其私有成员,不与伴生类同名的对象称之为孤立对象。

 



8 case class(样本类)是什么?


case class是不可实例化的类,一旦构建了这个类,它会自动生成一些方法和伴生对象,注意的是这个伴生对象也会自动生成一些自己的方法。它具有以下特性:

(1)构造对象时,不需要new;

(2)类中的参数默认添加val关键字,即参数不能修改,如果需要的话也可以使用var;

(3)默认实现了toString,equals,hashcode,copy,apply,unapply等方法;

 


9 abstract class(抽象类)和trait(特质)的区别?


在Scala工程中抽象类和特质是很有用的工具,这个问题需要先回答什么是抽象类以及什么是特质。

抽象类是在普通类的基础上增加了abstract关键字,无法对其进行实例化,它是用来被子类继承的,抽象类中可以只定义字段和方法,具体的值和实现在其子类中实现,子类也可以进行重写。

特质是一种特殊的类,它支持多重继承,但是trait不能有类参数也不能实例化。

总结一下它们的区别:

(1)一个类只能继承一个抽象类,但是可以通过with关键字继承多个特质;

(2)抽象类有带参数的构造函数,特质不行。


10 谈谈scala中的隐式转换


当需要某个类中的一个方法,但是这个类没有提供这样的一个方法,需要进行类型转换,转换成提供了这个方法的类,然后再调用这个方法,想要这个类型转换自动完成,就需要提前定义隐式转换函数,这样在使用要转换类型的方法的时候就可以自动转换。这个隐式转换函数可以通过导入相关的包来完成-比如java和Scala几个之间的相互转换就可以导入Scala.collection.JavaConversions类中的函数来实现,也可以自己编写。

 


11 什么是隐式参数?


所谓隐式参数,指的是在函数或者方法中,定义使用implicit修饰的参数。当调用该函数或方法时,如果没有传该参数的值,Scala会尝试在变量作用域中找到一个与指定类型相匹配的使用implicit修饰的对象,即隐式值,注入到函数参数中函数体使用。值得注意的是,隐式参数是根据类型匹配的,因此作用域中不能同时出现两个相同类型的隐式变量,否则编译时会抛出隐式变量模糊的异常。