=Scala==
-
scala语言有什么特点?什么是函数式编程?有什么优点?
1、scala语言集成面向对象和函数式编程
2、函数式编程是一种典范,将电脑的运算视作是函数的运算。
3、与过程化编程相比,函数式编程里的函数计算可以随时调用。
4、函数式编程中,函数是一等公民。 -
Scala数据类型有哪些?
Byte、Short、Int、Long、Float、Double、Char、String、Boolean、Unit、Null、Nothing、Any
Any是所有其他类的超类
AnyRef类是Scala里所有引用类(reference class)的基类 -
Scala 中String 对象是可变还是不可变?假如要创建一个可以修改的字符串,应该使用哪个类?
在 Scala 中,字符串的类型实际上是 Java String,它本身没有 String 类。
在 Scala 中,String 是一个不可变的对象,所以该对象不可被修改。这就意味着你如果修改字符串就会产生一个新的字符串对象。但其他对象,如数组就是可变的对象。 -
Scala 中什么是闭包?
闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
闭包的实质就是代码与用到的非局部变量的混合,即:闭包 = 代码 + 用到的非局部变量 -
什么是隐式转换函数?什么场景下用?怎样定义?
我们经常引入第三方库,但当我们想要扩展新功能的时候通常是很不方便的,因为我们不能直接修改其代码。scala提供了隐式转换机制和隐式参数帮我们解决诸如这样的问题。 -
什么是函数柯里化?
柯里化技术是一个接受多个参数的函数转化为接受其中几个参数的函数。经常被用来处理高阶函数。 -
Scala 中object是什么?有什么作用?
object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method;
在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的。
object作用:1.存放工具方法和常量 2.高效共享单个不可变的实例 3.单例模式 -
Scala 中什么是伴生类和伴生对象?有什么优点?
一个class文件,还有一个与class同名的object文件,那么就称这个object是class的伴生对象,class是object的伴生类;(注意:伴生类和伴生对象必须存放在一个.scala文件中;)
伴生类和伴生对象的最大特点是,可以相互访问; -
Scala 中的apply方法是什么?通常在哪里实现?有什么优点?
apply方法通常是在伴生对象中实现的,其目的是,通过伴生类的构造函数功能,来实现伴生对象的构造函数功能;
通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,…参数n)时apply方法会被调用;
在创建伴生对象或伴生类的对象时,通常不会使用new class/class() 的方式,而是直接使用 class(),隐式的调用伴生对象的 apply 方法,这样会让对象创建的更加简洁; -
Scala中特质trait的用法:
首先先将trait作为接口使用,此时的trait就与Java中的接口 (interface)非常类似;
在trait中可以定义抽象方法,就像抽象类中的抽象方法一样,只要不给出方法的方法体即可;
类可以使用extends关键字继承trait,注意,这里不是 implement,而是extends ,在Scala中没有 implement 的概念,无论继承类还是trait,统一都是 extends;
类继承后,必须实现其中的抽象方法,实现时,不需要使用 override 关键字;
Scala不支持对类进行多继承,但是支持多重继承 trait,使用 with 关键字即可。
trait中未被实现的方法默认是抽象方法,因此不需要在方法前加abstract
-
Scala中特质的调用链:
Scala中支持让类继承多个trait后,可依次调用多个trait中的同一个方法,只要让多个trait中的同一个方法,在最后都依次执行 super 关键字即可;
类中调用多个trait中都有的这个方法时,首先会从最右边的trait的方法开始执行,然后依次往左执行,形成一个调用链条;
这种特性非常强大,其实就是设计模式中责任链模式的一种具体实现; -
Scala中的模式匹配和样例类、option类型:
Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。
Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。用case class定义。
在Scala中Option类型用样例类来表示可能存在或者可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值 -
说说Scala中的协变、逆变、非变:
协变和逆变主要是用来解决参数化类型的泛化问题。Scala的协变与逆变是非常有特色的,完全解决了Java中泛型的一大缺憾;举例来说,Java中,如果有 A是 B的子类,但 Card[A] 却不是 Card[B] 的子类;而 Scala 中,只要灵活使用协变与逆变,就可以解决此类 Java 泛型问题;
由于参数化类型的参数(参数类型)是可变的,当两个参数化类型的参数是继承关系(可泛化),那被参数化的类型是否也可以泛化呢?Java中这种情况下是不可泛化的,然而Scala提供了三个选择,即协变(“+”)、逆变(“-”)和非变。
下面说一下三种情况的含义,首先假设有参数化特征Queue,那它可以有如下三种定义。
(1) trait Queue[T] {}
这是非变情况。这种情况下,当类型B是类型A的子类型,则Queue[B]与Queue[A]没有任何从属关系,这种情况是和Java一样的。
(2) trait Queue[+T] {}
这是协变情况。这种情况下,当类型B是类型A的子类型,则Queue[B]也可以认为是Queue[A]的子类型,即Queue[B]可以泛化为Queue[A]。也就是被参数化类型的泛化方向与参数类型的方向是一致的,所以称为协变。
(3) trait Queue[-T] {}
这是逆变情况。这种情况下,当类型B是类型A的子类型,则Queue[A]反过来可以认为是Queue[B]的子类型。也就是被参数化类型的泛化方向与参数类型的方向是相反的,所以称为逆变。 -
scala中高阶函数是什么?有哪些?:
Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数。在函数式编程语言中,函数是“头等公民”,把函数最为参数或者是返回值是函数的函数叫高阶函数
高阶函数包含:作为值的函数、匿名函数、闭包、柯里化等等。 -
Scala 中柯里化是什么?有什么优点?
柯里化(Currying)指的是把原来接受多个参数的函数变换成接受一个参数的函数过程,并且返回接受余下的参数且返回结果为一个新函数的技术。
scala柯里化风格的使用可以简化主函数的复杂度,提高主函数的自闭性,提高功能上的可扩张性、灵活性。可以编写出更加抽象,功能化和高效的函数式代码。 -
说说Scala中隐式转换?及优缺点?
Scala提供的隐式转换和隐式参数功能,是非常有特色的功能。是Java等编程语言所没有的功能。它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法。通过这些功能,可以实现非常强大、特殊的功能。其中所有的隐式值和隐式方法必须放到object中。
缺点:然而使用Scala的隐式转换是有一定的限制的,总结如下:
implicit关键字只能用来修饰方法、变量(参数)。
隐式转换的方法在当前范围内才有效。如果隐式转换不在当前范围内定义(比如定义在另一个类中或包含在某个对象中),那么必须通过import语句将其导入。
//通过这种方式导入 类名.方法 import Scala01.f1
优点:隐式转换函数名可以是任意的,隐式转换与函数名有关,只与函数参数类型和返回值类型有关
隐式函数可以有多个,就是隐式函数列表,但是必须保证当前环境下,只有一个隐式函数能被识别