文章目录
1.偏函数
- 偏函数(Partial Function)是数学概念,它不是
函数
的一种,它跟函数是平行的概念. - scala中的偏函数是一个Trait,类型为
PartialFunction[A,B]
,其中接收一个类型为A的参数,返回一个类型为B的结果
2.函数柯里化
- 柯里化函数也叫多参数列表函数,本身就是指把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术
- 简单理解就是改变函数的形式,不改变函数的功能.看上去有点鸡肋,但是如果和隐式参数结合使用就能大大简化代码,同时也降低了一定的代码可读性
3.scala的apply和unapply方法的作用
- apply方法:通常,在一个类的伴生对象中定义apply方法,在生成这个类的对象时,就省去了new关键字
- unapply方法:可以认为unapply方法是apply方法的反向操作,apply方法接受构造参数变成对象,而unapply方法接受一个对象,从中提取值
4.元组
- 元组在Scala语言中是一个非常有用的容器对象.与列表一样,元组也是不可变的.但是与列表不同,元组可以包含不同类型的元素.例如列表只能写成List[Int]或者List[String],但是元组可以同时拥有Int和String.元组使用场景很多,比如说,如果需要在方法里返回多个对象.Java里做法是创建JavaBean已包含多个返回值,Scala里可以仅返回元组.而且做起来也很简单,只需要把元组实例化需要的对象放在括号里,并用逗号分隔即可.元组实例化之后,可以用点号,下划线和基于1的索引访问其中的元素.目前scala支持的元组最大长度为22,对于更大长度可以使用集合,或者扩展元组
5.scala优点
- scala是一门多范式(multi-paradigm)编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性
- scala运行在Java虚拟机上,并且兼容现有的Java程序
- scala源代码被编译成Java字节码,所以它可运行在JVM上,并且可以调用现有的Java类库
- 作为流行的开源大数据内存计算引擎Spark的源码编程语言-spark有着良好的性能优势
- scala将成为未来大数据处理的主流语言
6.scala中关键字implicit用法
- 隐式值和隐式参数,隐式函数(自动转换类型与类型增强),隐式类
- 详情查看如下链接:implicit常用用法
7.特质与抽象类的区别
- 1.一个类只能继承一个抽象类,但是可以通过with关键字继承多个特质
- 2.抽象类有带参数的构造函数,特质不行
- 一个类扩展多个特质是很方便的,但却只能扩展一个抽象类,所以优先使用特质,如果需要使用构造函数参数,使用抽象类
8.闭包
- 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量
- 闭包的实质就是代码与用到的非局部变量的混合,即
闭包 = 代码+用到的非局部变量
9.Unit
- scala中的Unit类型类似于Java中的void,表示无返回值.主要的不同是在scala中可以有一个Unit类型值,也就是(),然而Java中是没有void类型的值的.除了这一点,Unit和void是等效的.一般来说每一个返回void的Java方法对应一个返回Unit的scala方法
10.ArrayBuffer和Array区别
- 数组里面可以放数字,字符串,布尔值以及对象和数组等,ArrayBuffer放0和1组成的二进制数据
- 数组放在堆中,ArrayBuffer则把数据放在栈中(所以取数据时后者更快)
- ArrayBuffer初始化后固定大小,数组则可以自由增减
11.Java和Scala的区别
-
可以说scala来源于java,但又高于Java,scala就是在Java语言的基础上增加了一层编码的壳让程序开发人员可以通过函数式编程的方式开发程序
-
由于scala最终被编译为.class文件运行在JVM虚拟机上,本质上还是Java,所以在Scala和Java可以调用双方的api
具体区别如下: -
1.变量的声明
-
变量var 常量val scala支持自动类型推测
-
scala更多是采用常量而不是变量来解决问题,这样带来的好处是可以减少多线程并发安全问题,特别适用于多并发分布式场景
-
2.函数声明
-
关键字
def
,scala函数无返回值用Unit,相对于Java中的void -
scala支持函数式编程,可以使用高阶函数,函数是一等公民
-
3.基本类型
-
其实可以认为scala中并没有真正意义上的基本类型,它的类型都是类
-
4.静态
-
Java中静态static是违背Java面向对象的编程思想和封装特性的
-
scala取消了静态的概念,使用了单例对象object来实现
-
5.对字符串的支持
-
scala支持使用字符串插值的方式对字符串进行格式化,使用
$
开头进行取值 -
另外支持使用三引号将其中的内容直接包起来,其中可以包括任何字符而不需要转义
-
6.类
-
scala类中的字段自动带有getter和setter方法,另外可以使用
@BeanProperty
注解来生成Java中的Get/Set方法 -
scala中的每个类都有一个主构造器,这个构造器和类定义交织在一起,类的参数直接成为类的字段,主构造器执行类体中的所有语句
-
7.scala不支持break
-
使用return代替
-
在循环中用if和布尔值类型变量进行守卫
-
导入Java中支持break的包
-
8.访问范围问题
-
Java中外部看不到内部,内部能看到外部
-
Scala中外部看不到内部,内部看不到外部
-
9.通配符
-
Java使用*进行通配
-
scala使用_进行通配
-
10.默认导入的类
-
scala默认导入java.lang包,scala包,scala.Predef类
-
Java默认导入java.lang包
-
11.特质与接口区别
-
Java中称为类实现接口(关键字
implements
),scala中称为混入特质(关键字with
) -
和Java中接口不同,scala中特质可以包含带有方法体的方法
-
12.动态绑定(多态)
-
java中只有方法是动态绑定的,而scala属性和方法都是动态绑定的