上次咱们介绍了函数式编程的好处,并使用scala写了一个小小的例子帮助你们理解,从这里开始我将真正开始介绍scala编程的一些内容。java
这里会先重点介绍scala的一些语法。固然,这里是假设你有一些java或者python的基础,毕竟大部分人不会将scala看成第一门学习编程的语言。python
不过这些语法知识记不住也不要紧,自己语法这种东西就应该在使用中被记住。这里写这篇的目的也只是梳理一遍,方便你们对语法有个初步的印象,后面能够随时查询。编程
PS:所使用的版本是scala 2.11.8,那咱们开始吧json
首先,scala有两种运行方式,分别是在交互式环境运行,以及经过脚本的方式运行。先运行一下吧,在scala安装目录下有一个bin文件夹,在这个文件夹双击scala.bat(Windows系统),就能够启动scala交互环境。固然,通常在安装scala,都会将“scala目录/bin”加入到系统的Path变量中,这个时候直接运行cmd,而后输入scala就能够了。并发
由于scala也是运行在jvm平台上的,因此用脚本方式的话,相似于java那样,须要先编译再执行。可是通常咱们都会使用IDE来处理。经过我我的是更加喜欢idea的,只要下载免费的社区版就能够知足平常开发需求。app
首先,咱们先来用一个例子来看看具体语法。在交互式环境中输出hello world。异步
//声明一个字符串 scala> val str = "Hello world" str: String = Hello world //打印 scala> println(str) Hello world
相信你们看一眼就能明白这两行代码是干吗的,那我就说一点看不出来的。jvm
scala声明一个变量能够用val和var。val意为这个变量是不可变的,var意为这个变量是可变的。ide
scala> val num = 1; //声明一个不可变的数值型变量 num: Int = 1 scala> num = 2 //由于不可变,因此要更改时,出错了 <console>:12: error: reassignment to val num = 2 ^ scala> var num_var = 1; //声明一个可变的数值型变量 num_var: Int = 1 scala> num_var = 2; //能够改变 num_var: Int = 2
从功能上来讲,相似于java的final关键字。并且scala语言倾向于让你多使用val,而少用var。模块化
为何呢?
由于可以更方便得使用并发,在java的并发编程中,最喜欢的就是final的变量,由于它都是不变的,随便怎么用就怎么用。而scala所支持的函数式编程,自然就适合异步和并发,因此作了这样的处理,包括scala的集合类,默认也是不可变的类型,若是要使用可变的集合,须要手动指定。
说完了变量,再来讲说scala的数据类型。这里直接上一张图。
这张图说明了scala的数据类型继承关系,咱们先看最上面的Any类型,Any类型是全部数据类型的爸爸,在它里面定义了equals,toString这些方法,相似于java的object。这一点和java仍是比较相似的。
而后接着往下看,Any又有两个字类,左边的AnyVal以及右边的AnyRef。右边的先无论,那个主要是集合那边的知识,咱们只看左边的。
AnyVal又被多个数据类型继承,这些就是平常经常使用的一些数据类型了,能够看到和Java相似,都是Int,Double,Long这些。对了,这些数据类型,Int,Double,Long什么的,都是类,不像java,还有分int和Integer。
最后再来看看最下面的Nothing和Null吧,把这俩货搁在一块说是由于这几个概念很是容易混淆,我本身要用的时候还得去查清楚了。
是的,你没看错,虽然这里是用scala来进行函数式编程,但scala也一样提供了OOP的能力,后面有很大的几率也会说到,咱们就顺带着简单介绍一下吧。
仍是和java中的概念相似,只不过名字稍稍有些变化。对应过来大概是这样的:
其中,虽说java的接口对应的是scala的trait,但trait这个东西其实和interface仍是有不少不同的,好比能够定义变量,能够直接定义方法内容等。固然,没有构造器和没法接收参数这个仍是不变滴。
trait Car { val brand: String } trait Shiny { val shineRefraction: Int } class BMW extends Car { val brand = "BMW" } //经过with关键字,一个类能够扩展多个特质: class BMW extends Car with Shiny { val brand = "BMW" val shineRefraction = 12 }
接下来重点说说class和object。
在scala中,是没有static这个关键字的,那么这样一来,不少java的功能就都无法实现,好比静态方法,或者是单例模式,或者是没有main方法。这个时候,object就出现了。
每一个class均可以有一个同名的object,这个object被称之为伴生对象(companion class)。class和object能够互相访问对方的私有成员(public,private这些权限访问和java是同样的)。
class Json{ } object Json { def toJsonObject(str:String):Unit = { } var a = 1 def main(args:Array[String]):Unit = { val json = Json json.toJsonObject("......") //不须要new对象,直接使用toJsonObject方法。 } }
得益于object,咱们能够像调用java静态方法同样地写scala代码,而这一切,都要归功于object。
由于!object里面的变量,或是方法,都是static的,这里说的static是方便有java基础的童鞋理解,scala是没有static这一个关键字的。若是要使用单例,那更简单,直接定义一个object就好了。
object Timer { var count = 0 def currentCount(): Long = { count += 1 count } } 能够这样使用: scala> Timer.currentCount() res0: Long = 1
接下来讲个比较经常使用的语法糖吧,那就是object的apply方法。当一个类只有一个用途的时候,就能够用它。
scala> class Foo {} defined class Foo //有一个apply方法 scala> object FooMaker { | def apply() = new Foo | } defined module FooMaker //新建object,自动得就调用了apply scala> val newFoo = FooMaker() //赋值的对象是Foo,由于调用了FooMaker()的apply newFoo: Foo = Foo@5b83f762
看上面的代码,object是不用new出来而能够直接就用的。而用的时候,其实就默认调用了这个object的apply方法。
有没有以为很熟悉,这其实就是工厂模式。
OK,这些就是scala里面,有关面向对象的一些基础知识,固然还有更高阶的,好比集合和多态,这些后面用到的时候再说吧。
本次介绍了scala的基础变量和类型,scala默认是更加推荐使用不可变的变量,而常见的数据类型和java基本差很少,只是名字和用法上有些差异。
而在面向对象这一块上,也基本和java差很少,只要有java的基础,熟悉这部分的语法应该不是问题。
那么按个人理解来讲说为何scala会有这些改动吧。首先,scala是在java发明后才被建立出来的,其设计理念必然会比java成熟一些,因此也就会想解决一些java的缺陷,好比说java某些语法较为冗余。而scala则较为灵活一些,好比多了object,不须要每次都new一个对象,再好比有交互式环境。
其次,scala也是为了贴近于函数式编程,函数式的核心,就是编写无反作用代码。而更本质地说,就是将代码拆分模块化,各个模块各司其职,不是本身的别瞎动,本身管好本身的事,这个其实和微服务的思想是同样的。
因此scala才会默认得让变量是不可变的,就是为了尽可能让代码保持不变。
OK,那今天就先说到这吧,下次再说scala语法的重头戏,集合和函数。