kotlin-string-template
Kotlin String Templates
1. Overview
In order to get familiar with other features and to know how to use Kotlin, have a look at one of our Kotlin tutorials.
2. Strings in Kotlin
Like in Java, Strings in Kotlin are immutable. That means that we have no means to alter a String once it’s created. However, we may derive another String from a given one.
Kotlin has enriched Java String class with additional functionality.
For example, the method padEnd() allows us to format a String, so that the expression:
"Hello".padEnd(10, '!')
Which produces a new string “Hello!!!!!”.
3. String Templates
For example, this code in Java:
String message = "n = " + n;
In Kotlin is just:
val message = "n = $n"
Any valid Kotlin expression may be used in a String template:
val message = "n + 1 = ${n + 1}"
Unlike Java, many Kotlin’s constructs (but certainly, not all) are expressions.
Therefore, a String template may contain logic as well:
val message = "$n is ${if(n > 0) "positive" else "not positive"}
Notice that inside the curly brackets there’s a valid Kotlin expression. This is a reason why we don’t escape the nested double quotes.
String templates are resolved by evaluating the expression and invoking a toString() method on the result of the evaluation.
String templates can be nested:
val message = "$n is ${if (n > 0) "positive" else
if (n < 0) "negative and ${if (n % 2 == 0) "even" else "odd"}" else "zero"}"
The String template parser starts to resolve it from the most nested template, evaluates it and invokes a toString() method on it.
Though the String templates may be nested, it’s a good idea to have them as simple as possible. This isn’t difficult at all because Kotlin provides us with many useful tools.
What if we want to use a raw dollar sign and not as a part of a String template?
Then we escape it by putting a backslash in front of it:
val message = "n = \$n"
What follows the dollar sign becomes a usual String – it isn’t evaluated anymore and it is interpreted as is.
4. Raw Strings
In Kotlin, additionally, we have triple-quoted raw Strings that can contain special characters without the need for escaping them.
The resulting String is contained between two consecutive non-overlapping occurrences of triple double-quote-signs “.
For example, in Java, in order to create properly a String containing a Windows-style file path to a resource located at C:\Repository\read.me, we should define it in this way:
String path = "C:\\Repository\\read.me"
In Kotlin, we may use the triple-quoted notation in order to achieve the same result:
val path = """C:\Repository\read.me"""
We may use this notation in order to create a multi-line String:
val receipt = """Item 1: $1.00
Item 2: $0.50"""
Which creates a String that spans exactly two lines. If we prefer this indentation:
val receipt = """Item 1: $1.00
>Item 2: $0.50""".trimMargin(">")
We use a trimMargin() method that eliminates eventual white spaces from the start of every line up to the first occurrence of the margin prefix (> in the example above).
Triple-quoted strings don’t support any escape sequences. It means that if we wrote
val receipt = """Item 1: $1.00\nItem 2: $0.50"""
in order to get a two-line String, we’d get a single line containing the characters \n instead of the expected line break.
Triple-quoted Strings do support templating though.
It means that any sequence starting with the dollar sign gets resolved to a string in a way as we have described in the previous section. We may use this fact in order to make the escape characters work:
val receipt = """Item 1: $1.00${"\n"}Item 2: $0.50"""
5. Conclusion
In this article, we’ve considered one feature of the Kotlin language that is absent in Java – String templates. We’ve illustrated their usage in case of usual and multi-line Strings.
You may find all code snippets mentioned here in our repository on GitHub.