网站首页 > 基础教程 正文
在我的理解中,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的类型层级结构
除了每种数据类型是一个对象,它们也存在于类型层级结构:
类型 | 说明 |
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
猜你喜欢
- 2024-10-12 Scala初学者入门指南!涵盖20多个基本技巧
- 2024-10-12 Scala循环性能问题,为了性能,你愿意牺牲代码的可维护性么?
- 2024-10-12 使用Apache Kafka时的7个错误 apache kafka实战pdf
- 2024-10-12 scala中为什么不建议用return scala for until
- 2024-10-12 scala——泛型方法、类、特质的使用,泛型边界、协变逆变非变
- 2024-10-12 程序员构建总是出问题,怎么办? 程序员构建总是出问题,怎么办呢
- 2024-10-12 scala——列表、元祖、列表相关知识
- 2024-10-12 scala语言基础图解-第一阶段(变量-条件-循环-方法-函数-集合)
- 2024-10-12 Scala入门视频已更新至88讲,后续还有大约20讲左右的视频就结束
- 2024-10-12 Scala快速入门 - 环境安装篇 scala安装步骤
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)