scala函数式编程(二) scala基础语法介绍

上次我们介绍了函数式编程的好处,并使用scala写了一个小小的例子帮助大家理解,从这里开始我将真正开始介绍scala编程的一些内容。

这里会先重点介绍scala的一些语法。当然,这里是假设你有一些java或者python的基础,毕竟大部分人不会将scala当作第一门学习编程的语言。

不过这些语法知识记不住也没关系,本身语法这种东西就应该在使用中被记住。这里写这篇的目的也只是梳理一遍,方便大家对语法有个初步的印象,后面可以随时查询。

PS:所使用的版本是scala 2.11.8,那我们开始吧

一.scala两种运行方式

首先,scala有两种运行方式,分别是在交互式环境运行,以及通过脚本的方式运行。先运行一下吧,在scala安装目录下有一个bin文件夹,在这个文件夹双击scala.bat(Windows系统),就可以启动scala交互环境。当然,一般在安装scala,都会将“scala目录/bin”加入到系统的Path变量中,这个时候直接运行cmd,然后输入scala就可以了。

因为scala也是运行在jvm平台上的,所以用脚本方式的话,类似于java那样,需要先编译再执行。但是一般我们都会使用IDE来处理。通过我个人是更加喜欢idea的,只要下载免费的社区版就可以满足日常开发需求。

二.scala变量和类型

2.1 变量

首先,我们先来用一个例子来看看具体语法。在交互式环境中输出hello world。

//声明一个字符串
scala> val str = "Hello world"
str: String = Hello world

//打印
scala> println(str)
Hello world

相信大家看一眼就能明白这两行代码是干嘛的,那我就说一点看不出来的。

scala声明一个变量可以用val和var。val意为这个变量是不可变的,var意为这个变量是可变的。

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的集合类,默认也是不可变的类型,如果要使用可变的集合,需要手动指定。

2.2 scala数据类型

说完了变量,再来说说scala的数据类型。这里直接上一张图。


image

这张图说明了scala的数据类型继承关系,我们先看最上面的Any类型,Any类型是所有数据类型的爸爸,在它里面定义了equals,toString这些方法,类似于java的object。这一点和java还是比较类似的。

然后接着往下看,Any又有两个字类,左边的AnyVal以及右边的AnyRef。右边的先不管,那个主要是集合那边的知识,我们只看左边的。

AnyVal又被多个数据类型继承,这些就是日常常用的一些数据类型了,可以看到和Java类似,都是Int,Double,Long这些。对了,这些数据类型,Int,Double,Long什么的,都是类,不像java,还有分int和Integer。

最后再来看看最下面的Nothing和Null吧,把这俩货搁在一块说是因为这几个概念非常容易混淆,我自己要用的时候还得去查清楚了。

  • java的null(scala也可以用,不过n是小写):就是代表没有任何东西,即空。一般新建一个对象,默认值就是这货。
  • scala的Nothing:所有数据类型的子类,没有具体的值可以对应到这种类型,也就是说你没法为Nothing类型赋值,包括null也不行。那可能有的小伙伴就会问了,那要这个玩意干嘛呢?一般嘛,try catch的返回值就是这种类型,还有程序exit的时候也是返回它,大概就是在不需要返回值的时候,就返回这个意思意思。
  • scala的Null(注意大小写):是所有集合类的子类,这种类型只能使用null来赋值,可以说基本没什么卵用。只要知道有这么个东西就行。

三.scala面向对象编程

是的,你没看错,虽然这里是用scala来进行函数式编程,但scala也同样提供了OOP的能力,后面有很大的概率也会说到,我们就顺带着简单介绍一下吧。


image

还是和java中的概念类似,只不过名字稍稍有些变化。对应过来大概是这样的:

  • java的interface -> scala的trait (其实trait更类似abstract class)
  • java的abstract class -> 一样是abstract class
  • java的class -> scala的class和object(关于class和object的区别,会在后面说)

其中,虽然说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语法的重头戏,集合和函数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容

  • 函数式编程 引言 Scala中的函数是Java中完全没有的概念。因为Java是完全面向对象的编程语言,没有任何面向...
    义焃阅读 1,280评论 2 5
  • 面向对象编程之类 定义一个简单的类 // 定义类,包含field以及方法 // 创建类的对象,并调用其方法 get...
    义焃阅读 790评论 0 2
  • Databricks Scala 编程风格指南 本文转载自 https://github.com/databric...
    雪轩辕阅读 1,176评论 0 1
  • 这篇讲义只讲scala的简单使用,目的是使各位新来的同事能够首先看懂程序,因为 scala 有的语法对于之前使用习...
    MrRobot阅读 2,914评论 0 10
  • Scaladoc是什么:scala api文档,包含了scala所有的api以及使用说明,class、object...
    义焃阅读 2,599评论 0 1