1.5 Scala语法特性

本文来自艾叔编著的《零基础快速入门Scala》免费电子书,添加文末艾叔微信,获取完整版的PDF电子书

如果我们有其它编程语言(C/C++/Java)的基础,那么,Scala很好上手,Scala也支持命令式编程,因此,完全可以把Scala当做命令式编程语言来用。当然,如果要使用函数式编程,则要熟悉Scala的函数式编程接口、方法和语法,并在平时加以应用,形成习惯。

下面仅对Scala基本语法中的一些基本特性进行介绍,这个特性主要是对比C/C++/Java的基本语法来的。

  1. 可以声明两种类型的变量

变量声明的通用结构是:val/var 变量名:变量类型,中间用冒号:隔开,例如下面的代码

val num:Int = 0

var num:Int = 0

其中,val num:Int=0,声明了一个Int类型的变量,初始值是0,num是不可改变的,永远是0;var num:Int=0,声明了一个Int类型的变量,初始值是0,num是可以改变的,后续,可以对num赋值其它整型值。

  1. 支持类型推断,不需要声明类型

所谓类型推断,是指,在声明变量时,如果该变量的类型是可以推测出来的,那么,声明的变量就不用指定类型。这样做的好处是,减少冗余信息,代码简洁,且减少错误。例如,下面的代码,根据=右边的赋值,编译器可以推测出num是整型。但num是Int还是Long还是其它整型,这个是无法推断的,Scala默认是取Int。

val num:Int = 0

因此,加上类型推断,可以写成下面的形式,这样的代码更简洁。

val num = 0

当然,如果num实际的类型是Long,那就要直接指定,如下,这种方式和C/C++/Java的用法很像。

val num:Long = 0

  1. 支持类型推断,不需要声明返回值类型

Scala会根据方法中最后一行表达式值的类型,推断返回值类型,因此,如果类型可以推断出来,那么,在方法的冒号(:)右侧,不需要指定类型,例如下面的方法add,其返回值类型可以推断是Int,因此在add(a: Int, b: Int)的右侧不需要加冒号(:)并指定类型。

  def add(a: Int, b: Int) = {

    a + b

  }

如果返回值需要是Unit,那就会和最后一行表达式的值类型冲突,解决办法有2个,第一种方法是直接在函数声明中指定Unit,如下所示。

  def add(a: Int, b: Int):Unit = {

    a + b

  }

第二种方法是,在最后一行直接添加(),这个值的类型就是Unit。

  def add(a: Int, b: Int) = {

    a + b

    ()

  }

& 如果返回值类型无法推断,例如递归函数,则要显式地指明返回类型。

  1. 代码结束不需要分号

C/C++/Java一行代码的结尾要加分号(;),Scala不需要加分号,当然加上也不会出错。

val bigList = new ArrayBuffer[Int]

此外,如果一行有多条语句,倒是可以加上分号作为分隔,但是,不建议在一行内书写多条语句。

  1. 方法返回值的时候不用return

C/C++/Java,当函数结束,需要返回值的时候,需要使用return关键字+返回值,例如return 0、return 变量、或者return 表达式。

Scala中,方法结束位置,可以直接写值、变量或表达式,例如:

  def add(left: Int, right: Int):Int={

    left + right

  }

不要写成

    return left + right

Scala不建议在使用return,因为,使用return,可能会导致Scala程序运行时出错。因此,如果之前使用过C/C++/Java,习惯了return,不在万不得以的情况下,不要使用return。具体的,可以看下,下面的两段代码。

第一段代码如下。

    val mul1 = (i:Int) => {

      if (i == 0) -1 else 2*i

    }

    val data1 = (0 to 3).map(mul1)

第二段代码如下。

    val mul2 = (i:Int) => {

      if (i == 0) return -1 else return 2*i

    }

    val data2 = (0 to 3).map(mul2)

第一段代码的执行结果是正确的,而第二段代码执行是错误的,为什么呢?

原因就在于,第二段代码在返回值时,使用了return,如果在其它语言中,mul2里面的return,只是结束当前mul2的调用,但是,在Scala中,mul2中的return会直接结束外部调用它的map函数,从而,返回错误结果。

但是,另一段代码用了return又没有问题。这是因为,第二段代码是匿名函数对象(用的val),匿名函数没有被当成一个子函数,而是被当成了外部函数中的一段代码。第三段代码是直接定义了一个函数,因此,它是一个标准的子函数,子函数中return,就是结束子函数,如下所示。

    def mul3(i:Int):Int={

      if (i == 0) return -1 else return 2*i

    }

    val data3 = (0 to 3).map(mul3)

添加艾叔微信,加入Linux(Shell+Zabbix)、大数据(Spark+Hadoop)、云原生(Docker+Kubernetes)技术交流群

关注艾叔公众号,获取更多一手信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值