Scala专题系列(一):Scala基础

2022-04-18 13:52:22 浏览数 (1)

在开始之前,先来简要的介绍一下Scala这门语言。

Scala 是 Scalable Language 的简写,是一门多范式的编程语言(函数式编程&面向对象编程)

Scala 是一门更简洁,更强大的语言通常而言,在大数据以及其他以数据为中心的计算领域里,应用Scala 和函数式编程能够构造杀手级应用。满足现代软件工程师需求的语言;它是一门静态类型语言,支持混合范式;它也是一门运行在 JVM 之上的语言,语法简洁、优雅、灵活。 Scala 拥有一套复杂的类型系统, Scala 方言既能用于编写简短的解释脚本,也能用于构建大型复杂系统

一 :Scala的特性:

面向对象特性

Scala是一种纯面向对象的语言,Scala 引入特征( trait)改进了 Java 的对象模型,每个值都是对象,即便是数值类型。

函数式编程

Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的

Scala 完全支持函数式编程( FP),函数式编程已经被视为解决并发、大数据以及代码正确性问题的最佳工具。使用不可变值、被视为一等公民的函数、无副作用的函数、高阶函数以及函数集合,有助于编写出简洁、强大而又正确的代码

更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML数据。

二 :Scala基础

1:变量声明

在Scala中,允许在声明变量是可变的还是不可变(只读)的,不可变的用val关键字声明:

val str : String = "hello scala"

上例就是声明了一个String 类型的字符串str 并赋值为"hello scala"

val 在声明时必须被初始化

一个可变变量用关键字var来声明,var声明的变量是可变的,声明后可以再次对其赋值,但是也必须在声明的同时立即初始化

var price:double = 100.0

关于上述提到,val和var声明变量时必须初始化这一个规则,也有例外情况,比如这两个关键字均可以用在构造函数的参数中,这时候变量是该类的一个属性,因此显然不必在声明时进行初始化。此时如果用 val 声明,该属性是不可变的;如果用 var 声明,则该属性是可变的

为了减少可变变量在并发编程中,引起bug,应该尽可能的使用不可变变量,而比较常见的一种现象是当你正在使用的对象被其他人修改时,将引起对象产生不可预见的行为,这种bug往往是比较难查找的

2:分号

在Java和C 中,每个语句都以分号结束,而在Scala中,与JavaScript和其他脚本语言类似,行尾的位置不需要分号。同样 } ,else,以及类似的位置也不必写分号。

但是如果在单行中写下多个语句,就需要将它们以分号隔开,例如:

if(n < 0) { x = x * n; n -= 1 }

当然,如果你是java或者C 或者C#程序员,不适应没有分号的编程,那么你也可以加上分号,其实是没有影响的。只是没有分号更简洁一些。

3 :scala常用类型

和Java一样,Scala也有七种数值类型 :Byte ,Char,Short,Int,Long,Float和Double以及一个Boolean类型,和Java不同的是这些类型是类,Scala并不区分基本类型和引用类型,对于它来讲所以得类型都是一个类

在Scala中,我们用方法而不是强制类型转换来做数值类型之间的转换

4:方法声明

Scala 中声明方法的结构如下:

代码语言:javascript复制
def hello( hi : String ) : Uint = {
    println(hi)
}

如上定义了一个hello() 方法,方法的定义符为def 默认是public的,然后参数指定为字符串类型 hi,返回值为Uint 也就是java中的void,然后后面紧跟着 = { } 花括号里面是方法体

如果函数的返回值是Uint的,那么我们也可以将其省略掉,如下:

代码语言:javascript复制
def hello(hi :String)={  }

方法的返回值

前面我们定义了一个Uint的函数,如果我们要定义一个有返回类型的函数的话,就直接将Uint改为对应的返回类型即可。如下:

代码语言:javascript复制
def hello(hi:String):String = {
    hi 
}

在前面方法返回值的例子中,我们也看到了,我直接将传入的参数hi直接返回去了,但是没有用return这个关键字,是的。在Scala中,方法返回值最终是不需要return来修饰的,Scala会自动的推导出返回值

5:类型推断

先来看一段Java代码

代码语言:javascript复制
HashMap<Integer, String> intToStringMap = new HashMap<Integer, String>();

我们不得不两次指定类型参数 <Integer, String>。 Scala 使用类型注解一词表示类似

HashMap<Integer, String> 的显式类型声明。

Java 7 引入了尖括号操作符来推断表达式右边的泛型类型,降低了冗余度:

HashMap<Integer, String> intToStringMap = new HashMap<>();

利用自动推断类型信息,以上声明可以用 Scala 重写如下:

val intToStringMap: HashMap[Integer, String] = new HashMap

如果我们也可以将 HashMap[Integer, String] 放在等号后边,代码会更简洁:

val intToStringMap2 = new HashMap[Integer, String]

但是在有些情况下,我们必须显式类型注解,比如 :

声明了可变的 var 变量或不可变的 val 变量,没有进行初始化。(例如,在类中的

抽象声明,如 val book: String, var count: Int)。

  • 所有的方法参数(如 def deposit(amount: Money) = {… })。
  • 方法的返回值类型,在以下情况中必须显式声明其类型。

– 在方法中明显地使用了 return(即使在方法末尾也是如此)。

– 递归方法。

– 两个或多个方法重载(拥有相同的函数名),其中一个方法调用了另一个重载方

法,调用者需要显式类型注解。

– Scala 推断出的类型比你期望的类型更为宽泛,如 Any。

6:保留字

列出了 Scala 的保留字。其中的一些我们之前已经遇到过,还有许多保留字在 Java

中也能找到,并且它们在两种语言中的含义是相同的。

0 人点赞