Skip to content

Scala 字符串

在 Scala 中,字符串是字符序列,由 String 类型表示,它直接由 Java 的 java.lang.String 支持。这意味着 Scala 字符串是不可变的(immutable),并且你可以访问所有标准的 Java 字符串方法。

字符串通常使用双引号括起来的字符串字面量创建。

val greeting: String = "Hello, world!"
val language = "Scala"
// Multi-line strings
val multiLine = """This is a
multi-line
string."""
@main def StringCreationDemo(): Unit = {
println(greeting)
println(language)
println(multiLine)
}

与 Java 字符串一样,Scala 字符串也是不可变的。一旦创建,String 对象就不能被改变。看起来修改字符串的操作(如连接)实际上是创建并返回一个新的 String 对象。

val s1 = "Hello"
val s2 = s1 + ", Scala!" // Creates a new String "Hello, Scala!"
println(s1) // Output: Hello (s1 remains unchanged)
println(s2) // Output: Hello, Scala!

对于需要进行多次修改的场景,请使用 scala.collection.mutable.StringBuilder 以获得更好的性能,然后使用 .toString() 转换回 String。

Scala 提供了强大的字符串内插(string interpolation)功能,可以直接将变量值或表达式嵌入字符串字面量中。这通常比传统的字符串连接更具可读性。

在字符串字面量前加上 s。以 $ 开头的变量或表达式会被求值并插入。

val name = "Alice"
val age = 30
val message = s"My name is $name and I am $age years old."
val complexMessage = s"Next year, I will be ${age + 1}."
println(message) // Output: My name is Alice and I am 30 years old.
println(complexMessage) // Output: Next year, I will be 31.

在字符串字面量前加上 f。允许使用变量/表达式后的 printf 风格格式说明符后跟 % 来格式化嵌入的值。

val height = 1.825 // meters
val weight = 75.5 // kg
val formatted = f"Height: $height%.2f meters, Weight: $weight%.1f kg"
println(formatted) // Output: Height: 1.83 meters, Weight: 75.5 kg

在字符串字面量前加上 raw。类似于 s,但不处理转义序列(如 \n, \t)。

val path = raw"C:\Users\Default\Documents"
val escaped = s"This has a newline \n character."
val rawEscaped = raw"This has a literal \n sequence."
println(path) // Output: C:\Users\Default\Documents
println(escaped) // Output: This has a newline
// character.
println(rawEscaped) // Output: This has a literal \n sequence.

Scala 字符串继承了 Java 的方法,并且 Scala 的 RichString 隐式转换增加了更多方法。

方法/运算符描述
length返回字符数。
charAt(index)返回指定索引处的字符。
concat(str) or +连接字符串。
substring(begin, end)提取子字符串。
toUpperCase, toLowerCase转换为大写/小写。
startsWith(prefix), endsWith(suffix)检查是否以指定前缀开头/后缀结尾。
contains(substring)检查是否包含指定子字符串。
indexOf(char/str), lastIndexOf(char/str)查找第一个/最后一个出现位置的索引。
replace(oldChar, newChar), replaceAll(regex, replacement)替换字符或匹配模式。
split(separator)根据分隔符将字符串分割成数组。
trim移除开头/结尾的空白字符。
isEmpty, nonEmpty检查字符串是否为空。
toIntOption, toDoubleOption, etc.(来自 RichString)安全地转换为数字类型,返回 Option。
val data = " Scala Programming "
println(s"Length: ${data.length}") // Output: 21
println(s"Char at 3: ${data.charAt(3)}") // Output: C
println(s"Trimmed: '${data.trim}'") // Output: 'Scala Programming'
println(s"Uppercase: ${data.trim.toUpperCase}") // Output: SCALA PROGRAMMING
println(s"Contains 'Prog': ${data.contains("Prog")}") // Output: true
val parts = data.trim.split(" ")
println(s"Split: ${parts.mkString(", ")}") // Output: Scala, Programming
val numStr = "123"
println(s"To Int Option: ${numStr.toIntOption}") // Output: Some(123)
val badNumStr = "abc"
println(s"To Int Option: ${badNumStr.toIntOption}") // Output: None

请参考 java.lang.String 和 scala.collection.immutable.StringOps(通过 RichString)的文档,以获取可用方法的完整列表。