字符串插值

Scala中的String构建在Java中的String之上,并添加了额外的特性,如字符串插值(字符串插值是一种将字符串内的值与变量相结合的机制)。字符串插值是根据数据创建字符串的过程。用户可以将任何变量的引用直接嵌入处理后的字符串文本并格式化字符串。

Scala中的插值符号是在字符串的第一个双引号之前添加的s前缀。然后,美元符号操作符$可以用来引用变量。例如,下面的代码就应用了字符串插值:

val name = "张三"
s"我的朋友叫${name}"

输出结果如下所示:

Scala提供了如下几种可用的字符串插值方法:

  • s插值器。
  • f插值器。
  • raw插值器。

字符串s插值器

使用插值器s,字符串字面量允许用户使用引用变量直接追加数据。下面的代码演示了s插值器和及显示结果:

var bookName = "Spark大数据处理技术"
println(s"最畅销的Spark图书是$bookName")

执行结果如下所示:

可以同时引入多个变量,如下面的代码所示(当引用变量与其它文字字面量之间没有空格时,需要用花括号将引用变量括起来):

    val bookName = "Spark大数据处理技术"
val pages = 330				// 页码
val price = 65.00			// 单价
println(s"${bookName}这本书共有${pages}页,零售价格为${price}。")

输出结果如下所示:

此外,可以使用字符串插值器计算任意表达式,如下面的代码所示:

    val bookName = "Spark大数据处理技术"
val quantity = 5				// 购买数量
val price = 65.00   			// 单价
println(s"${bookName}这本书单价为${price},一共买了${quantity}本,则总金额是:${price * quantity}")

输出结果如下所示:

字符串s插值器还可以使用表达式。下面的代码演示了这种用法:

val age = 33
println(s"过一年,长一岁:${age + 1}")
println(s"你今年是33岁吗?${age == 33}")
println(s"仰天大笑出门去,${"哈"*3}")

输出结果如下所示:

字符串s插值器还可以引用对象字段。下面的代码演示了这种用法:

case class Student(name: String, score: Int)
val zhangsan = Student("张三", 95)
println(s"${zhangsan.name}的成绩是${zhangsan.score}")

输出结果如下所示:

字符串f插值器

Scala提供了一种从数据创建字符串的新机制。对字符串字面量使用f插值器允许用户创建格式化的字符串,并在处理后的字符串文字中直接嵌入变量引用。下面的代码演示了f插值器的使用:

var bookPrice = 65.00
val bookName = "Spark大数据处理技术"
println(f"${bookName}这本书的价格是${bookPrice}元")
println(f"${bookName}这本书的价格是${bookPrice}%1.1f元")
println(f"${bookName}这本书的价格是${bookPrice}%1.2f元")

输出结果如下所示:

%之后允许的格式基于Java提供的格式字符串。

另外,字符串f插值还可以这样用:

object demo02 {
   def main(args: Array[String]): Unit = {
      val item = "apple"
      println(f"我今天开发了一款新的$item%.3s")
      println(f"我今天开发了一款新的${item}%8s")
      println(f"PI值是:${355/113.0}%.2f")
      println(f"PI值是:${355/113.0}%.3f")
   }
}

输出结果如下所示:

我今天开发了一款新的app
我今天开发了一款新的   apple
PI值是:3.14
PI值是:3.142

也可以先将带有字符串插值的字符串保存到一个变量中,然后再输出。代码如下所示:

val content = f"${bookName}这本书的价格是${bookPrice}%.2f元"
println(content)

输出结果如下所示:

字符串raw插值器

使用raw插值器可避免字符串中的的转义字符起作用。也就是说,当使用raw插值器时,在字符串内不执行字面量的转义。例如,使用\n与raw插值器不返回换行字符。下面的代码演示了raw插值器的使用:

val bookId = 101
val bookName = "Spark大数据处理技术"
println(s"图书编号是$bookId。\n图书名称是:$bookName")
println(raw"图书编号是$bookId。\n图书名称是:$bookName")

输出结果如下所示:


《PySpark原理深入与编程实战》