Scala 中的字符串处理非常灵活,主要基于 Java 的 String 类,但提供了许多额外的语法糖和功能。
1. 字符串创建
// 双引号创建
val str1: String = "Hello, Scala"
// 类型推断
val str2 = "Type inference works"
// 多行字符串(三引号)
val multiLine = """
Line 1
Line 2
Line 3
"""
2. 字符串插值
Scala 提供了三种字符串插值方式:
s 插值器(变量替换)
val name = "Alice"
val age = 30
val str = s"Name: $name, Age: $age" // "Name: Alice, Age: 30"
// 表达式计算
val expr = s"Next year: ${age + 1}" // "Next year: 31"
f 插值器(格式化)
val height = 1.75
val formatted = f"Height: $height%.2f meters" // "Height: 1.75 meters"
val hex = f"255 in hex: ${255}%x" // "255 in hex: ff"
raw 插值器(不转义)
val rawStr = raw"Line 1\nLine 2" // "Line 1\\nLine 2" - \n 不被转义
val sStr = s"Line 1\nLine 2" // 实际换行
3. 字符串操作
val str = "Scala Programming"
// 长度
val len = str.length // 17
// 索引访问(实际是 apply 方法)
val char = str(0) // 'S'
val char2 = str.charAt(0) // 'S'
// 子字符串
val sub1 = str.substring(0, 5) // "Scala"
val sub2 = str.substring(6) // "Programming"
// 查找
val index = str.indexOf("Prog") // 6
// 转换
val upper = str.toUpperCase() // "SCALA PROGRAMMING"
val lower = str.toLowerCase() // "scala programming"
// 分割
val parts = "a,b,c".split(",") // Array("a", "b", "c")
// 去除空白
val trimmed = " hello ".trim // "hello"
4. 字符串比较和模式匹配
// 比较
val equal = "hello" == "hello" // true(Scala 使用 == 比较内容)
val refEqual = "hello".eq("hello") // 引用比较
// 模式匹配
val result = str match {
case s if s.startsWith("Scala") => "Starts with Scala"
case s if s.contains("Java") => "Contains Java"
case _ => "Other"
}
5. 字符串构建
使用 StringBuilder
val builder = new StringBuilder
builder.append("Hello")
builder.append(" ")
builder.append("World")
val result = builder.toString() // "Hello World"
mkString 方法(集合转字符串)
val list = List(1, 2, 3, 4)
val str1 = list.mkString // "1234"
val str2 = list.mkString(", ") // "1, 2, 3, 4"
val str3 = list.mkString("[", ", ", "]") // "[1, 2, 3, 4]"
6. 字符串转换
// 其他类型转字符串
val intStr = 42.toString // "42"
val doubleStr = 3.14.toString // "3.14"
// 字符串转其他类型
val intVal = "123".toInt // 123
val doubleVal = "3.14".toDouble // 3.14
val boolVal = "true".toBoolean // true
// 安全转换(避免异常)
val safeInt = "123a".toIntOption // None
7. 多行字符串和 stripMargin
// 使用 stripMargin 对齐多行字符串
val code =
"""|def hello(name: String): Unit = {
| println(s"Hello, $name")
|}""".stripMargin
// stripMargin 会移除每行开头的管道符和前面的空白
8. 自定义字符串插值器
// 定义自定义插值器
implicit class JsonHelper(val sc: StringContext) extends AnyVal {
def json(args: Any*): String = {
// 实现 JSON 构建逻辑
s"""{"${sc.parts(0)}": "${args(0)}"}"""
}
}
val name = "Alice"
val jsonStr = json"name: $name" // {"name": "Alice"}
9. Java 互操作
import java.util.regex.Pattern
// 使用 Java 的 String 方法
val javaStr: java.lang.String = "Java String"
val scalaStr: String = "Scala String" // 可以无缝互操作
// 正则表达式
val pattern = "\\d+".r
val matches = pattern.findAllIn("123 abc 456")
10. 性能考虑
- Scala 字符串是不可变的(继承自 Java String)
- 大量字符串拼接时,考虑使用
StringBuilder - 对于复杂的字符串处理,考虑使用
scala.collection.StringOps的方法
Scala 的字符串处理结合了 Java 的健壮性和 Scala 的函数式特性,提供了既安全又表达力强的 API。