大数据学习笔记1.2 Scala变量与数据类型

本文介绍了Scala中的变量声明,包括val和var的使用,以及数据类型的层次结构,如Any、AnyVal和AnyRef。强调了Scala中变量初始化的重要性,以及val作为常量的特性,鼓励优先使用val。此外,还讲解了基本数据类型、类型转换和引用类型转换的相关知识。
摘要由CSDN通过智能技术生成

一、变量声明

1、简单说明

  • Scala中变量的声明使用关键字valvarval类似Java中的final变量,也就是常量,一旦初始化将不可修改;var类似Java中的非final变量,可以被多次赋值,多次修改。

  • val - value - 值

  • var - variable - 变量

2、利用val声明变量

2.1、声明方式

  • val <变量名>[: 数据类型] = 变量值

  • 定义变量比较灵活,可以指定数据类型,也可以不指定数据类型,由Scala根据赋的值自行判断数据类型

  • 在声明变量上,Scala兼具Java和Python的特点。Java是静态语言,声明变量必须指定数据类型,Python是动态语言,声明变量不需要指定数据类型。

2.2、案例演示

  • 声明一个val字符串变量name,其实定义的是一个常量

  • 上述代码中的第二行为执行第一行的输出信息,从输出信息中可以看出,该变量类型由Scala自动推断为String

  • 当然也可以在声明变量时指定数据类型,与Java不同的是,数据类型需要放到变量名的后面,这使得面对复杂的数据类型时更易阅读。

  • 由于val声明的变量是不可修改的,若对声明的变量name进行修改,则会报错

  • 因此,如果希望变量可以被修改(can be mutated),就需要使用var声明。

3、利用var声明变量

3.1、声明方式

  • var <变量名>[: 数据类型] = 变量值

3.2、案例演示

  • 声明一个var字符串变量message,然后利用print函数输出其值

  • 对var变量message重新赋值,再输出其值

4、换行输入语句(续行)

  • 如果需要换行输入语句,那么只需要在换行的地方按回车键,解析器会自动在下一行以竖线进行分割

  • 如果要输入多行字符串,得使用三引号

  • 去掉多行字符串的前导空格

5、同时声明多个变量

  • Scala还可以将多个变量放在一起进行声明,将一个数值同时赋给多个变量

  • Scala不能一次对多个变量赋不同的值

6、总结变量的声明

6.1、变量必须初始化

  • 定义变量需要初始化,否则会报错。

6.2、定义变量可以不指定数据类型

  • 定义变量时可以不指定数据类型,系统会根据初始化值自动推断变量的类型。

6.3、鼓励优先使用val(常量)

  • Scala中鼓励优先使用val(常量),除非确实需要对其进行修改,才使用var(变量)。

6.4、语句不需要写结束符

  • Scala语句不需要写结束符,除非同一行代码使用多条语句时才需要使用分号隔开

二、数据类型

1、Scala类型层次结构

在Scala中,所有的值都有一个类型,包括数值和函数。如下图所示,说明了Scala的类型层次结构

  • AnyVal - Any Value

  • AnyRef - Any Reference

1.1、Any类型

  • Any是Scala类层次结构的根,也被称为超类或顶级类。Scala执行环境中的每个类都直接或间接地从该类继承。该类中定义了一些通用的方法,例如equals()hashCode()toString()Any有两个直接子类:AnyValAnyRef

1.2、AnyVal类型

  • AnyVal表示值类型,有9种预定义的值类型,它们是非空的Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是一个不包含任何信息的值类型,和Java语言中的void等同,用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。

1.3、AnyRef类型

  • AnyRef表示引用类型。所有非值类型都被定义为引用类型。Scala中的每个用户定义类型都是AnyRef的子类型。AnyRef对应于Java中的java.lang.Object

1.4、案例演示

  • 定义一个类型为List[Any]的变量listlist中包括字符串、整数、字符、布尔值和函数,由于这些元素都属于对象Any的实例,因此可以将它们添加到list中。

  • 遍历列表元素,并显示其数据类型

  • 获取列表前三个元素构成的子列表

  • 将列表反序,原列表不变

2、基本数据类型

2.1、基本类型表

序号

1

2

3

4

5

6

7

8

9

类型

Byte

Short

Int

Long

Char

String

Float

Double

Boolean

说明

字节型

短整型

整型

长整型

字符型

字符串

浮点型

双精度

布尔型

34

127

43423

3452342L

‘a’, ‘\n’

“Courage”

“”“I love

Scala

very much.”“”

34.67F

34534.454, 45.34242D

true, false

2.2、简要说明

(1) String在java.lang包下,其余类型在scala包下,由于Scala会自动导入java.lang和scala包,因此这些类型可以在程序中直接使用。

(2)其实scala中并没有真正意义上的基本类型(如Java的基本类型),以上十种基本类型都是类。

(3)在Scala中,基本数据类型与其它类的区别在于,其对象都以直接量形式体现,直接量与Java中基本相同。

(4)String类型的"““用法:在String直接量中可以使用””“…”""的语法将一段内容直接包括起来,使其内容中可以包含任意字符而不需转义,此时可在每行前使用管道符|控制缩进格式,在字符串上调用stripMargin来使字符串在|处对齐。

2.3、基本类型的富包装器

序号

类型

富包装器

1

Byte

scala.runtime.RichByte

2

Short

scala.runtime.RichShort

3

Int

scala.runtime.RichInt

4

Long

scala.runtime.RichLong

5

Char

scala.runtime.RichChar

6

String

scala.runtime.RichString

7

Float

scala.runtime.RichFloat

8

Double

scala.runtime.RichDouble

9

Boolean

scala.runtime.RichBoolean

3、数据类型转换

3.1、值类型的转换

  • Scala中的值类型可以按下图的方式转换,且转换是单向的

  • Long值赋给Float类型变量,在这种情况下会丢失一些精度,因此会弹出一个警告,可以利用.toFloat方法解决这个问题

  • 如果将Float类型转换成Long类型就会报错,不能自动从Float类型转换成Long类型,但是可以调用方法来实现

3.2、引用类型的转换

  • 此外,Scala还可以将引用类型转换为其子类型。

  • Nothing是所有类型的子类,在Scala类层级的最低端。Nothing没有对象,因此没有具体值,但是可以用来定义一个空类型,类似于Java中的标示性接口(如Serializable,用来标识该类可以进行序列化)。举个例子,如果一个方法抛出异常,异常的返回值类型就是Nothing(虽然不会返回)。

  • Null是所有引用类型(AnyRef)的子类,所以Null可以赋值给所有的引用类型,但不能赋值给值类型,这个和Java的语义是相同的。Null有一个唯一的单例值null。

三、课后练习

  1. 了解各种定义变量的方法。

  1. 了解各种类型之间的相同与不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值