Scala中的string

23 阅读1分钟

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。