Scala 数据类型
Scala 数据类型
Section titled “Scala 数据类型”Scala 拥有丰富的类型系统,其中每个值都是一个对象。与 Java 区分原始类型和对象类型不同,Scala 统一了这些概念。基本的数据类型,如 Int、Double、Boolean 都是类,继承自 AnyVal。
值类型 (AnyVal):
Section titled “值类型 (AnyVal):”这些类型大致对应于 Java 的原始类型,但在 Scala 中它们是类。它们提供了性能优势,因为运行时通常可以将它们优化为底层原始类型。
| 数据类型 | 描述 |
|---|---|
| Byte | 8 位有符号整数。范围:-128 到 127 |
| Short | 16 位有符号整数。范围:-32,768 到 32,767 |
| Int | 32 位有符号整数。范围:-2,147,483,648 到 2,147,483,647 |
| Long | 64 位有符号整数。范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。使用 L 后缀(例如,100L)。 |
| Float | 32 位 IEEE 754 单精度浮点数。使用 F 后缀(例如,3.14F)。 |
| Double | 64 位 IEEE 754 双精度浮点数。十进制字面量的默认类型(例如,3.14)。 |
| Char | 16 位无符号 Unicode 字符。范围:U+0000 到 U+FFFF。用单引号括起来(例如,'A')。 |
| Boolean | 表示逻辑值:true 或 false。 |
| Unit | 表示不返回计算结果的类型(类似于 void)。只有一个值:()。继承自 AnyVal。 |
引用类型 (AnyRef):
Section titled “引用类型 (AnyRef):”这些类型对应于 Java 的对象类型。所有用户定义的类、特质(trait)和标准库类,如 String、List、Option,都继承自 AnyRef(它是 java.lang.Object 的别名)。
| 常见引用类型 | 描述 |
|---|---|
| String | 字符序列。底层由 java.lang.String 支持。不可变。 |
| All user-defined classes | 您定义的类的实例(例如,class Person(...))。 |
| Standard Collections | List、Vector、Map、Set、Option 等。 |
| Null | 一种类型,其唯一实例是 null。它是所有 AnyRef 类型的子类型。避免使用 null;推荐使用 Option。 |
| Nothing | 一种特质,是 所有 其他类型的子类型,包括 AnyVal。它没有实例。可用于表示异常终止(例如,throw exception)或空集合(List[Nothing])。 |
Scala 类型层次结构:
Section titled “Scala 类型层次结构:”所有类型都继承自共同的根类 Any。Any 有两个直接子类:AnyVal(用于值类型)和 AnyRef(用于引用类型)。
AnyAnyValDouble,Float,Long,Int,Short,Byte,Char,Unit,Boolean
AnyRef(alias forjava.lang.Object)String,List,Option, 所有用户类等。Null(AnyRef所有类型的子类型)
Nothing(所有类型的子类型,包括AnyVal和Null)
字面量是直接在代码中表示的固定值。
整数字面量:
Section titled “整数字面量:”默认是 Int 类型。对于 Long 类型,使用 L 或 l 后缀。
val intLiteral = 42val longLiteral = 1234567890Lval hexLiteral = 0x2A // Hexadecimal (equals 42)val octalLiteral = 052 // Octal (equals 42) - Less common浮点数字面量:
Section titled “浮点数字面量:”默认是 Double 类型。对于 Float 类型,使用 F 或 f 后缀。
val doubleLiteral = 3.14159val anotherDouble = 1.0e20 // Scientific notationval floatLiteral = 2.718F布尔字面量:
Section titled “布尔字面量:”只有 true 和 false。
val isScalaFun = trueval isComplex = false字符字面量:
Section titled “字符字面量:”用单引号括起来的单个字符。
val charA = 'A'val newlineChar = '\n' // 转义序列val unicodeChar = '\u0041' // 'A' 的 Unicode 表示字符串字面量:
Section titled “字符串字面量:”用双引号括起来的字符序列。
val greeting = "Hello, world!\n" // 带转义字符的标准字符串
// 使用三引号的多行字符串val multiLine = """This stringspans multiplelines."""
// 带边界符剥离的多行字符串val indented = """|SELECT | name, | age |FROM users |WHERE active = true""".stripMargin符号字面量:
Section titled “符号字面量:”在 Scala 2.13 中已弃用,在 Scala 3 中已移除。符号曾用于可以动态创建的标识符,通常在反射或特定的 DSL 中使用。现在请改用字符串。
// 'mySymbol // 已弃用/移除的语法Null 值:
Section titled “Null 值:”null 字面量属于 Null 类型,可以赋值给任何 AnyRef 类型。然而,在惯用的 Scala 风格中,不鼓励使用 null。推荐使用 Option[T] 来表示可能的值缺失。
val name: String = null // 可能,但不推荐val age: Option[Int] = None // 表示缺失的推荐方式标准转义序列可以在 Char 和 String 字面量中使用:
| 序列 | 描述 |
|---|---|
| \b | 退格符 |
| \t | 制表符 |
| \n | 换行符 |
| \f | 换页符 |
| \r | 回车符 |
| ” | 双引号 |
| ’ | 单引号 |
| \ | 反斜杠 |
Unicode 字符也可以使用 \uxxxx 表示。