前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala专题系列(一):Scala基础

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

作者头像
用户5252199
发布2022-04-18 13:52:22
7160
发布2022-04-18 13:52:22
举报
文章被收录于专栏:大数据技术博文
在开始之前,先来简要的介绍一下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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术博文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档