scala基本语法(scala有哪些基本数据类型和操作符)

在我的理解中,Scala比Java还要面向对象。在Scala中,每种类型实际上都是一个对象,它设计的类型概念不像其他大部分语言那样简单。

Scala数据类型

Scala 与 Java有着相同的数据类型,下表列出了 Scala 支持的数据类型:

数据类型 描述
Byte 8位有符号补码整数
Short 16位有符号补码整数
Int 32位有符号补码整数
Long 64位有符号补码整数
Float 32位单精度浮点数
Double 64位双精度浮点数
Char 16位无符号Unicode字符
String 字符序列
Boolean true或false

运算符

类别 操作符
算数运算符 +、-、*、/
关系运算符 >、<、==、!=、>=、<=
逻辑运算符 && 、||、!
位运算符 &、||、^、<<、>>

Note:

1、Scala中没有 ++、--运算符

2、Scala可以直接使用==、!=进行比较,与equals方法表示一致。而比较两个对象的引用值,使用eq

参考代码:

scala> val a=1
val a: Int = 1

scala> a--
1 |a--
  |^
  |postfix operator `--` needs to be enabled
  |by making the implicit value scala.language.postfixOps visible.
  |----
  |This can be achieved by adding the import clause 'import scala.language.postfixOps'
  |or by setting the compiler option -language:postfixOps.
  |See the Scaladoc for value scala.language.postfixOps for a discussion
  |why the feature needs to be explicitly enabled.

Scala的类型层级结构

除了每种数据类型是一个对象,它们也存在于类型层级结构:

scala基本语法(scala有哪些基本数据类型和操作符)

类型 说明
Any 所有数据类型的父类或超类,所有其他数据类型都是Any的子类
AnyVal 这是所有值类型的父类型,也就是所谓的原始类型的根类
AnyRef 这是所有引用类型的父类型,它是面向对象的,定义一个引用类型的变量时,其存储的是变量值的内存地址,而不是直接存储变量值
Unit 表示空,相当于其他语言的Void
Null Null是AnyRef的子类,它是所有引用类型的子类,可以将null赋值给任何
Nothing 所有类型的子类。在Scala中,每个表达式都必须返回一个值,如果出现无限循环或者一个终止应用程序的函数(报错),都会用到Nothing类型

思考问题:以下代码是否正确?

val a:Int = null

在解释输入代码得到结果如下:

scala> val a:Int=null
1 |val a:Int=null
  |          ^^^^
  |          Found:    Null
  |          Required: Int

错误原因:

Null类型并不能转换为Int类型,这是因为Null类型不是Int类型的子类。

Boolean类型

为表示某个命题是真还是假,会用到布尔(Boolean)类型。例如1小于2是真的(true)。布尔类型的取值只能是以下两种:

true
false

Note:

这两个值是严格区分大小写的,True/False/TRUE/"true"都不能算是布尔值。

参考代码:

scala> val a: Int = 1
val a: Int = 1

scala> a==1
val res1: Boolean = true

scala> a==2
val res2: Boolean = false

String类型

Scala提供多种定义字符串的方式,我们可以根据需要来选择合适的定义方式:

  • 双引号(" ")
  • 三个双引号(""" """)
  • 字符串插值(s"${变量名}")

 

使用双引号

语法:

val/var 变量名 = "字符串"

示例代码:

scala> val a="Hello World!"
val a: String = Hello World!

scala> print(a.length)
12

在遇到字符串中包含特殊字符的情形中,需要将这些特殊字符串进行转义。比如:如果字符串变量中包含双引号或者反斜杠,则必须使用转义。

还有一些特殊字符,如:

  • n(换行符)
  • t(制表符)
  • b(退格符)
  • r(回车符)

 

使用三个双引号

如果字符串中包含多行字符串或者内部有引号,我们可以使用三个双引号来包围字符串。

语法:

val/var 变量名 = """字符串1
字符串2
字符串3"""

参考代码:

scala> val words="""Hello everyone,
     | Lest's start learning "Scala" and "Spark"
     | Come On!"""
val words: String = Hello everyone,
Lest's start learning "Scala" and "Spark"
Come On!

 

字符串插值

语法:

val/var 变量名 = s"${变量|表达式}字符串"

参考代码:

scala> val name="Micky"
val name: String = Micky

scala> val intro=s"my name is ${name}"
val intro: String = my name is Micky

scala> val intro=s"my name is ${name.toUpperCase}"
val intro: String = my name is MICKY

另外,在Scala中有两种方式可以进行字符串插值——使用s或者f。其中f提供了一种简单的格式化数字的方法。

参考代码:

scala> s"the price is ${price}"
val res1: String = the price is 99.9

scala> f"the price is ${price}%.2f"
val res2: String = the price is 99.90

Note:

试图通过%.2f来格式化数字的操作,强制保留两位小数。

特别提示:

还有一点需要说明,如果想要保留字符串的原始样子,需要在字符串前加raw,这样字符串就不会进行任何处理或者插值操作。

参考代码:

scala> val aString = "line1 n line2"
val aString: String = line1
 line2

scala> val rawString = raw"line1 n line2"
val rawString: String = line1 n line2

字符串的常用方法

字符串长度

在Scala中,要获取字符串的长度可以只用length或者size方法

语法:

val/var strLength = "字符串".[size|length]

参考代码:

scala> val a="Hello World!"
val a: String = Hello World!

scala> a.length
val res1: Int = 12

scala> a.size
val res2: Int = 12

 

字符串分割

在数据处理的过程中,我们经常要按照一个特定的字符来拆分字符串。

语法:

val/var strList = "字符串".split("特定字符")

示例:

根据英文逗号拆分字符串"spark,hadoop,flink"

参考代码:

scala> val a ="spark,hadoop,flink"
val a: String = spark,hadoop,flink

scala> a.split(",")
val aList: Array[String] = Array(spark, hadoop, flink)

当使用split时,会得到一个数组,该数组包含字符串所有分割出来的部分,之后可以按照以下方式访问各部分:

参考代码:

scala> a.split(",")(0)
val res1: String = spark

scala> a.split(",")(1)
val res2: String = hadoop

scala> a.split(",")(2)
val res3: String = flink

 

查找字符串中字符的索引

想要找到字符串中某个字符的位置(索引位置),可以使用String的indexOf函数。

参考代码:

scala> val a ="scala"
val a: String = scala

scala> a.indexOf("a")
val res1: Int = 2

scala> a.indexOf("s")
val res2: Int = 0
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论