scala语言来源于java,scala以java的虚拟机(JVM)为运行环境,scala源码(.scala)会编译成.class文件。
两种语言之间有很多相似的地方,在一些语法上有些明显区别主要如下:
语言 | break | continue |
Scala | 函数式分格 | If else 或循环守卫 |
Java | 关键字,break | 关键字:continue |
语言 | 返回格式 |
Scala | 返回第一种形式: :返回值类型 = 返回第二种形式: = (返回类型自动推导) 返回第三种形式: (不写任何) 注意:没有写return ,默认最后一行为返回值;如果写了return,函数的返回值类型就不省略;在使用递归编程时,必须返回的数据类型 |
Java | 第一种 :有返回值,必须写返回值类型 第二种:无返回值,添加void |
语言 | 异常处理方法 |
Scala | Try-catch{case-case}-finally的方式处理异常 |
java | Try-catch-catch-finally的方式处理异常 |
语言 | 区别 |
Scala | 一切皆为对象 |
java | 由于历史原因,java中的基本类型、null、静态方法等不是对象 |
Scala | java | |
成员变量/属性 | 必须显示初始化 | 可以不初始化 |
构造器 | 主构造器为类名, 辅助构造器this,辅助构造器必须在第一行显式调用主构造器,也可以间接。 |
和类名必须一样 |
Bean属性 | 在scala中添加@BeanProperty字段时会自动生成setXX和getXX,便于java互操作 | setXX和getXX方法 |
Scala | java | |
Import语句 | 可以出现在任何地方 | 只能在文件顶部 |
Scala | java | |
封装方法 | 自动提供了setter/getter方法 注意:如果属性声明为private,则setter/getter也是private, 不添加时,默认为public |
需要手动添加 |
继承extends | 重写方法需要添加override修饰符,调用超类的方法需使用关键字super | 直接重写 |
子类的构造器 | 在子类中每个辅助构造器必须先调用构造器(也可以时间接) 注意:只有主构造器才能调用父类的构造器 |
会隐式调用构造器 也显示调用,(需自己添加) |
覆写字段 | 子类可以改写父类的字段, | Java中只有方法的重写,没有字段的重写 |
抽象类 | Abstract标记的类,方法不用标记abatract, | Java |
接口 | Scala使用特质trait来代替接口的概念,使用关键字extends继承, 多个特质之间使用with连接 注意:scala中在创建对象时,可以混入特质, |
使用关键字implemts继承, Java在创建对象时不能混入接口。 |
Scala集合 | Java集合 | |
集合种类 | 主要包括序列Seq、集Set 、映射Map,还可以分为可变和不可变两种类型 | 主要有Set、List和Map三个体系 |
将函数的返回类型为Unit的函数称之为过程。
当函数返回值被声明为lazy时,函数的执行将被推迟,直到初次使用时,该函数才会执行,这种函数称之为惰性函数,和java中的懒加载类似。
注意:lazy不能修饰 var
scala中没有静态的操作,为了能和java语言交互(java中有静态的概念),就产生了一种特殊的对象来模拟类对象,称为半生对象,这个给对象的内容可以放置在她的半生对象中申明和调用。
class 类名 为伴生类,将非静态内容写到该类
object 类名 为伴生对象,将静态内容写到该类
注意:伴生对象和伴生类应在同一源码文件中,
实现该方法,可以不加new 实现类名(参数)的方式构建对象实例;
可理解为接口,
在创建对象时,同时混入多个特质,称之为叠加特质。此时特质声明顺序为从左到右,方法执行我为从右到左。
例如
val mytriat = new Mytrait with DB4 wiith File4
注:如果混入该特征的类,已经继承了另一个类A类,则要求A类是特质超类的子类,否则就会出现了多继承现象,发生错误。
例如:
trait LoggedWxception extends Exception{}//zhengque
class CC{}
class UnhappyException extends CC with LoggedWxception{}
//发生错误,原因CC不是Exception的子类
即该特质中既有抽象方法,又有非抽象方法。
主要是为了解决特质循环依赖的问题,同时可以确保特质在不扩展某个类的情况下,依然可以做到限制该特质类的类型。
是以implicit关键字声明的带有单个参数的函数,这种函数会自动应用,将值从一种类型转换为另一种类型,隐式函数可以有多个,但应用时,会只是用一个,可以解决优雅的数据类型转换问题。
模式匹配类似于java中的switch语法,但是很强大,
其:采用match关键字声明,每个分支采用case关键字,但需要匹配时会从第一个分支开始,如果匹配成功则执行代码,如果所有case匹配不成功,那么会执行case_分支,类似于java中的default。
注意:如果case_没写,那么会抛出matchError。
模式中的变量:
如果在case关键字后跟变量,那么match前表达式的值会赋值给那个变量。
常见的匹配情况:数组的匹配、元组的匹配、列表的匹配、对象的匹配(对象提取器unapply),变量声明中的模式、for表达式中的模式;
用case关键字声明的类,自动生成toString、qualas、hashCode和copy方法类似一个模板。
如
case class Dollar(value:Double) extends Amount//样例类
使用PartialFunction【Any,Int】定义,表示偏函数接收的参数类型是Any,返回类型是Int,执行函数时,先执行isDefinedAt()如果为true,就会执行apply,否则过滤掉这个元素,继续遍历下一个元素。
akka模型是异步、非阻塞、高性能的事件驱动编程模型。
工作机制:
(1) ActorySystem创建Actor
(2) ActorRef:为Actor的代理或引用,消息是借助ActorRef来发送的。
(3) 消息发送到Dispatcher Message(消息分发器),它得到消息后会对消息进行分发到对应Actor的MailBox.
(4) Actor可以通过reveive方法来获取消息,然后处理。