根据我的研究,
Kotlin 有两种类型的字符串文字:-
转义的字符串,可能已转义其中的字符。
val s = "Hello ,Worldn" +
"from escaped stringn"+
"kotlin"
原始字符串由三引号 (""( 分隔,不包含转义,可以包含换行符和任何其他字符:
val m = """Hello, World
|from raw string
|kotlin """.trimMargin()
这些字符串可以在多行中使用,而无需连接每一行,也无需转义。
我们是否仅出于简单和易于实现而使用原始字符串,或者在任何情况下这些字符串是否提供了更好的性能?
这些是我们应该考虑使用原始字符串的其他用例吗?
你的答案在这个网站上有很好的解释。我将在这里只包括其中的重要部分。
Kotlin 中的字符串可以以多种方式使用,如上面的链接中所述。这完全取决于使用的要求。如果您有超大的字符串,如html页面等,那么您可以使用由三引号(""(分隔的原始字符串。在有短字符串的地方,您可以使用转义字符串。
它们之间没有真正的性能差异,但取决于您在其中构建值时使用的字符串串联量。
我不知道两种字符串文字类型之间的任何性能差异,但至少有一个有趣的用例,您应该考虑使用原始字符串:正则表达式。
正则表达式中的预定义字符类和许多其他构造由字符引入(例如
s
匹配空格字符(。当在字符串中包含它们时,您需要对它们进行转义:因此,对于正则表达式中的任何此类字符,您需要编写两个,例如"\d"
以匹配单个数字。
但是,原始字符串允许您跳过转义部分,从而产生比唯一的字符串文本类型转义时编写的更简洁的正则表达式,就像在 Java 中发生的那样。
请注意,原始字符串不是 Kotlin 引入的新概念或想法。例如,Python已经拥有它们很长时间了。
用例:房间查询中的查询语法着色
使用 Kotlin 的原始字符串,您可以在 Room 的 Dao 中编写多行查询,例如:
@Dao
interface HappyDao {
@Query(
"""
SELECT
One,
Two,
Three
FROM MYTABLE
"""
)
fun getAll(): List<MyObject>
}
并且仍然具有 Room 验证器的语法着色,就像您在一行上编写所有内容一样(以及在代码编写期间查询语法错误的警报(。它对于具有许多字段或连接的长查询特别有用。
如果没有原始字符串,它将是这样的:
@Dao
interface HappyDao {
@Query(
"SELECT" +
"One," +
"Two," +
"Three" +
" FROM MYTABLE"
)
fun getAll(): List<MyObject>
}
并且它不会受益于 Room 的语法着色。