Strings #
Kotlin Standard Library menyediakan ratusan fungsi untuk bekerja dengan String — jauh lebih kaya dari yang ditawarkan Java. Fungsi-fungsi ini diimplementasikan sebagai extension function pada tipe String dan CharSequence, sehingga kamu bisa memanggilnya langsung seperti metode native. Artikel ini adalah referensi komprehensif semua fungsi String yang tersedia di Kotlin Standard Library, dikelompokkan berdasarkan kegunaannya, lengkap dengan contoh praktis.
Pembuatan String #
// Literal biasa
val biasa = "Halo, Kotlin!"
// Raw string (multiline, tidak perlu escape)
val multiline = """
Baris pertama
Baris kedua
Baris ketiga
""".trimIndent()
// String template
val nama = "Budi"
val umur = 28
val sapaan = "Nama: $nama, Umur: $umur tahun, Panjang nama: ${nama.length}"
// Char ke String
val karakter = 'K'
val dariChar = karakter.toString() // "K"
val dariCode = 75.toChar().toString() // "K" (kode ASCII)
// String dari koleksi
val daftar = listOf("Kotlin", "Java", "Python")
val digabung = daftar.joinToString(", ") // "Kotlin, Java, Python"
val dgnPrefix = daftar.joinToString(", ", "[", "]") // "[Kotlin, Java, Python]"
val dgnTransform = daftar.joinToString { it.uppercase() } // "KOTLIN, JAVA, PYTHON"
// String.format — format seperti printf
val format1 = "Nama: %s, Umur: %d" .format("Budi", 28) // "Nama: Budi, Umur: 28"
val format2 = "Harga: Rp%,.0f".format(15_000_000.0) // "Harga: Rp15,000,000"
val format3 = "%05d".format(42) // "00042"
val format4 = "%.2f".format(3.14159) // "3.14"
// buildString — builder DSL
val dibangun = buildString {
append("Halo, ")
append("Kotlin")
appendLine("!") // append + newline
append("Versi: ")
append(2)
repeat(3) { append(".") }
}
Pemeriksaan dan Validasi #
val teks = " Halo, Kotlin! "
val kosong = ""
val spasiSaja = " "
// Cek panjang dan kekosongan
println(teks.length) // 18
println(teks.isEmpty()) // false — hanya cek panjang == 0
println(kosong.isEmpty()) // true
println(spasiSaja.isEmpty()) // false — ada karakter (spasi)
println(spasiSaja.isBlank()) // true — semua whitespace
println(teks.isBlank()) // false
println(teks.isNotEmpty()) // true
println(teks.isNotBlank()) // true
// Cek awalan dan akhiran
val url = "https://kotlin.unisbadri.com/api/v1"
println(url.startsWith("https://")) // true
println(url.endsWith("/v1")) // true
println(url.startsWith("http://")) // false
println(url.contains("unisbadri")) // true
println(url.contains("kotlin", ignoreCase = true)) // true
// Cek karakter
println("12345".all { it.isDigit() }) // true — semua digit
println("Hello".all { it.isLetter() }) // true — semua huruf
println("Kotlin123".any { it.isDigit() }) // true — ada digit
println("abc".none { it.isUpperCase() }) // true — tidak ada huruf besar
// Validasi format sederhana
val email = "[email protected]"
val isEmail = email.contains("@") && email.contains(".")
println(isEmail) // true (validasi sederhana, gunakan Regex untuk lebih tepat)
// Cek karakter pertama dan terakhir
println("Kotlin".first()) // K
println("Kotlin".last()) // n
println("Kotlin".firstOrNull()) // K
println("".firstOrNull()) // null (aman, tidak throw exception)
Perbandingan #
val a = "Kotlin"
val b = "kotlin"
val c = "Kotlin"
// Perbandingan case-sensitive (default)
println(a == b) // false
println(a == c) // true
println(a.equals(b)) // false
// Perbandingan case-insensitive
println(a.equals(b, ignoreCase = true)) // true
println(a.equals(b, ignoreCase = false)) // false
println(a.compareTo(b, ignoreCase = true)) // 0 (sama)
// Perbandingan leksikografis
println("apple".compareTo("banana")) // negatif (apple < banana)
println("banana".compareTo("apple")) // positif (banana > apple)
println("apple".compareTo("apple")) // 0 (sama)
// Sorting dengan compareTo
val kata = listOf("banana", "Apple", "cherry", "Date")
println(kata.sortedWith(compareBy(String::lowercase)))
// [Apple, banana, cherry, Date] — case-insensitive sort
// Cek kesamaan konten vs referensi
val s1 = "Hello"
val s2 = "Hello"
println(s1 == s2) // true — konten sama (structural equality)
println(s1 === s2) // true/false — referensi (tergantung JVM string interning)
Pencarian dan Indeks #
val teks = "Kotlin adalah bahasa yang hebat. Kotlin sangat kuat."
// indexOf — posisi pertama kali ditemukan
println(teks.indexOf("Kotlin")) // 0
println(teks.indexOf("kotlin")) // -1 (case-sensitive)
println(teks.indexOf("kotlin", ignoreCase = true)) // 0
println(teks.indexOf("Kotlin", startIndex = 5)) // 33 (cari dari indeks 5)
println(teks.indexOf("tidak ada")) // -1
// lastIndexOf — posisi terakhir ditemukan
println(teks.lastIndexOf("Kotlin")) // 33
println(teks.lastIndexOf("Kotlin", startIndex = 10)) // 0 (cari dari kanan, mulai dari 10)
// indexOfFirst dan indexOfLast — dengan kondisi lambda
println(teks.indexOfFirst { it.isUpperCase() }) // 0 (K)
println(teks.indexOfLast { it == '.' }) // 51
// Cek keberadaan
println("Kotlin" in teks) // true — operator in
println(teks.contains("Kotlin")) // true
// Cari semua kemunculan menggunakan Regex
val semuaKotlin = Regex("Kotlin").findAll(teks)
semuaKotlin.forEach { match ->
println("Ditemukan '${match.value}' di indeks ${match.range.first}")
}
// Ditemukan 'Kotlin' di indeks 0
// Ditemukan 'Kotlin' di indeks 33
Transformasi #
Kapitalisasi dan Case #
val teks = "halo, kotlin programming!"
// Ubah case
println(teks.uppercase()) // HALO, KOTLIN PROGRAMMING!
println(teks.lowercase()) // halo, kotlin programming!
println(teks.replaceFirstChar { it.uppercase() }) // Halo, kotlin programming!
println("HALO".replaceFirstChar { it.lowercase() }) // hALO
// capitalize (deprecated sejak Kotlin 1.5, gunakan replaceFirstChar)
// println(teks.capitalize()) // deprecated
// Title case — setiap kata diawali huruf besar
fun String.toTitleCase(): String {
return split(" ").joinToString(" ") { word ->
word.replaceFirstChar { it.uppercase() }
}
}
println("kotlin adalah bahasa keren".toTitleCase()) // Kotlin Adalah Bahasa Keren
// Uppercase/lowercase per karakter
println("Kotlin".map { if (it.isLetter()) it.uppercaseChar() else it }.joinToString(""))
// KOTLIN
Penghilangan Whitespace #
val teks = " \t Kotlin \n "
println(teks.trim()) // "Kotlin" — hapus whitespace di kedua ujung
println(teks.trimStart()) // "Kotlin \n " — hapus di awal saja
println(teks.trimEnd()) // " \t Kotlin" — hapus di akhir saja
// Trim karakter tertentu
println("---Kotlin---".trim('-')) // "Kotlin"
println("xxxKotlinxxx".trimStart('x')) // "Kotlinxxx"
println("xxxKotlinxxx".trimEnd('x')) // "xxxKotlin"
// Trim dengan kondisi lambda
println(" 123Kotlin456 ".trim { !it.isLetter() }) // "Kotlin"
Replace dan Substitusi #
val teks = "Halo, Kotlin! Kotlin hebat!"
// replace — ganti semua kemunculan (literal)
println(teks.replace("Kotlin", "Java")) // "Halo, Java! Java hebat!"
println(teks.replace("kotlin", "Java", ignoreCase = true)) // sama, case-insensitive
// replaceFirst — hanya ganti kemunculan pertama
println(teks.replaceFirst("Kotlin", "Python")) // "Halo, Python! Kotlin hebat!"
// replace dengan lambda — transformasi setiap kecocokan
println(teks.replace(Regex("[A-Z]")) { "[${it.value}]" })
// "[H]alo, [K]otlin! [K]otlin hebat!"
// replaceRange — ganti bagian tertentu
println("Halo, Dunia!".replaceRange(6, 11, "Kotlin")) // "Halo, Kotlin!"
// Hapus substring
println("Halo, Kotlin!".removePrefix("Halo, ")) // "Kotlin!"
println("Halo, Kotlin!".removeSuffix("!") // "Halo, Kotlin"
println("Halo, Kotlin!".removePrefix("Salah")) // "Halo, Kotlin!" (tidak berubah)
println("---Kotlin---".removeSurrounding("---")) // "Kotlin"
Pemecahan (Split) dan Pengambilan Bagian #
val csv = "Budi,28,Jakarta,Programmer"
// split — memecah berdasarkan delimiter
val kolom = csv.split(",")
println(kolom) // [Budi, 28, Jakarta, Programmer]
println(kolom.size) // 4
// split dengan limit
val duaBagian = csv.split(",", limit = 2)
println(duaBagian) // [Budi, 28,Jakarta,Programmer]
// split dengan Regex
val kalimat = "Kotlin; Java, Python\tGo"
val kata = kalimat.split(Regex("[;,\\s]+"))
println(kata) // [Kotlin, Java, Python, Go]
// lines — pecah berdasarkan newline
val multiline = "Baris 1\nBaris 2\nBaris 3"
println(multiline.lines()) // [Baris 1, Baris 2, Baris 3]
println(multiline.lineSequence().count()) // 3
// Pengambilan substring
val teks = "Kotlin Programming"
println(teks.substring(0, 6)) // "Kotlin" — indeks 0 sampai 5
println(teks.substring(7)) // "Programming" — dari indeks 7 sampai akhir
println(teks.substring(0..5)) // "Kotlin" — dengan range
// substringBefore dan substringAfter
val url = "https://example.com/api/v1"
println(url.substringAfter("://")) // "example.com/api/v1"
println(url.substringBefore("/api")) // "https://example.com"
println(url.substringAfterLast("/")) // "v1"
println(url.substringBeforeLast("/")) // "https://example.com/api"
// take dan drop
println("Kotlin".take(3)) // "Kot" — ambil N karakter dari awal
println("Kotlin".drop(3)) // "lin" — buang N karakter dari awal
println("Kotlin".takeLast(3)) // "lin" — ambil N karakter dari akhir
println("Kotlin".dropLast(3)) // "Kot" — buang N karakter dari akhir
// takeWhile dan dropWhile
println("123abc".takeWhile { it.isDigit() }) // "123"
println("123abc".dropWhile { it.isDigit() }) // "abc"
Padding dan Pengisian #
// padStart — tambah karakter di awal
println("42".padStart(5)) // " 42" — default spasi
println("42".padStart(5, '0')) // "00042" — pad dengan '0'
println("Kotlin".padStart(3)) // "Kotlin" — tidak berubah jika sudah cukup panjang
// padEnd — tambah karakter di akhir
println("Kotlin".padEnd(10)) // "Kotlin "
println("Kotlin".padEnd(10, '-')) // "Kotlin----"
// Contoh penggunaan: tabel dengan kolom terurut
val daftar = listOf("Budi", "Sari", "Ahmad Fauzi")
daftar.forEach { nama ->
print(nama.padEnd(15))
println("(${nama.length} karakter)")
}
// Budi (4 karakter)
// Sari (4 karakter)
// Ahmad Fauzi (11 karakter)
Konversi Tipe #
// String ke angka
println("42".toInt()) // 42
println("3.14".toDouble()) // 3.14
println("42".toLong()) // 42L
println("true".toBoolean()) // true
println("false".toBoolean()) // false
println("bukan boolean".toBoolean()) // false (tidak throw exception!)
// Konversi yang aman (mengembalikan null jika gagal)
println("42".toIntOrNull()) // 42
println("abc".toIntOrNull()) // null
println("3.14".toDoubleOrNull()) // 3.14
println("".toIntOrNull()) // null
// Dengan nilai default menggunakan Elvis
val angka = "abc".toIntOrNull() ?: 0
println(angka) // 0
// String ke Char array dan ByteArray
val chars = "Kotlin".toCharArray()
println(chars.toList()) // [K, o, t, l, i, n]
val bytes = "Kotlin".toByteArray()
println(bytes.size) // 6
val kembali = bytes.toString(Charsets.UTF_8)
println(kembali) // "Kotlin"
// Base64 encoding/decoding
val encoded = java.util.Base64.getEncoder().encodeToString("Kotlin".toByteArray())
println(encoded) // "S290bGlu"
val decoded = String(java.util.Base64.getDecoder().decode(encoded))
println(decoded) // "Kotlin"
Iterasi dan Pemrosesan Karakter #
val teks = "Kotlin 2024"
// Iterasi karakter
for (c in teks) print("$c-") // K-o-t-l-i-n- -2-0-2-4-
// forEachIndexed
teks.forEachIndexed { i, c ->
if (c.isDigit()) println("Digit '$c' di indeks $i")
}
// map — transformasi setiap karakter
val hurufBesar = teks.map { it.uppercaseChar() }.joinToString("")
println(hurufBesar) // KOTLIN 2024
// filter — saring karakter
val hurufSaja = teks.filter { it.isLetter() }
println(hurufSaja) // Kotlin
val digitSaja = teks.filter { it.isDigit() }
println(digitSaja) // 2024
// count — hitung karakter yang memenuhi kondisi
println(teks.count { it.isUpperCase() }) // 1 (K)
println(teks.count { it.isDigit() }) // 4
// Partisi karakter
val (huruf, bukan) = teks.partition { it.isLetter() }
println(huruf) // Kotlin
println(bukan) // " 2024"
// any dan all pada karakter
println(teks.any { it.isDigit() }) // true
println(teks.all { it.isLetter() }) // false (ada spasi dan digit)
StringBuilder — Efisiensi untuk Konkatenasi #
// ANTI-PATTERN: konkatenasi berulang dalam loop
var hasil = ""
for (i in 1..1000) {
hasil += "item-$i," // Membuat objek String baru setiap iterasi — tidak efisien
}
// BENAR: StringBuilder
val sb = StringBuilder()
for (i in 1..1000) {
sb.append("item-$i")
if (i < 1000) sb.append(",")
}
val hasilFinal = sb.toString()
// Atau lebih idiomatis dengan buildString
val hasilIdiomatis = buildString {
for (i in 1..1000) {
append("item-$i")
if (i < 1000) append(",")
}
}
// Operasi StringBuilder lainnya
val sb2 = StringBuilder("Kotlin")
sb2.insert(0, "Hello, ") // insert di awal
sb2.append(" 2024") // tambah di akhir
sb2.delete(0, 7) // hapus "Hello, "
sb2.reverse() // balik urutan
sb2.replace(0, 6, "Java") // ganti range
println(sb2.toString())
// StringBuilder sebagai mutable String view
val sb3 = StringBuilder("Kotlin Programming")
sb3[0] = 'k' // StringBuilder bisa dimodifikasi via indeks
println(sb3) // kotlin Programming
Extension Function Custom yang Berguna #
// Konversi ke slug URL
fun String.toSlug(): String {
return this
.lowercase()
.replace(Regex("[^a-z0-9\\s-]"), "")
.replace(Regex("\\s+"), "-")
.trim('-')
}
println("Belajar Kotlin 2024!".toSlug()) // "belajar-kotlin-2024"
// Truncate dengan ellipsis
fun String.truncate(panjang: Int, ellipsis: String = "..."): String {
return if (length <= panjang) this
else "${substring(0, panjang - ellipsis.length)}$ellipsis"
}
println("Kotlin adalah bahasa yang sangat hebat".truncate(20))
// "Kotlin adalah bah..."
// Cek apakah string adalah angka
fun String.isNumeric(): Boolean = toDoubleOrNull() != null
println("3.14".isNumeric()) // true
println("abc".isNumeric()) // false
println("42".isNumeric()) // true
// Mask string sensitif
fun String.maskAkhir(tampilkan: Int = 4, maskChar: Char = '*'): String {
if (length <= tampilkan) return this
return "${maskChar.toString().repeat(length - tampilkan)}${takeLast(tampilkan)}"
}
println("4111111111111234".maskAkhir(4)) // "************1234"
println("[email protected]".maskAkhir(7)) // "......email.com"
// Hitung kata
fun String.jumlahKata(): Int = trim().split(Regex("\\s+")).filter { it.isNotEmpty() }.size
println("Kotlin adalah bahasa keren".jumlahKata()) // 4
// Konversi camelCase ke snake_case
fun String.toSnakeCase(): String {
return replace(Regex("([a-z])([A-Z])"), "$1_$2").lowercase()
}
println("namaLengkapPengguna".toSnakeCase()) // "nama_lengkap_pengguna"
// Konversi snake_case ke camelCase
fun String.toCamelCase(): String {
return split("_").mapIndexed { i, word ->
if (i == 0) word.lowercase() else word.replaceFirstChar { it.uppercase() }
}.joinToString("")
}
println("nama_lengkap_pengguna".toCamelCase()) // "namaLengkapPengguna"
Ringkasan #
isBlank()vsisEmpty()—isEmpty()hanya memeriksa panjang == 0;isBlank()juga menganggap string hanya berisi whitespace sebagai “kosong”. Untuk validasi input pengguna,isBlank()hampir selalu lebih tepat.toIntOrNull()lebih aman daritoInt()—toInt()melemparNumberFormatExceptionjika string bukan angka.toIntOrNull()mengembalikan null yang bisa ditangani dengan Elvis operator?: 0.substringAfter()dansubstringBefore()— sangat berguna untuk parsing URL, file path, dan format teks berstruktur. Lebih bersih darisplit()[1]yang rawanIndexOutOfBoundsException.buildString { }untuk konkatenasi kompleks — gunakanbuildStringdaripada konkatenasi+dalam loop. Ia menggunakanStringBuilderdi balik layar tanpa boilerplate.joinToString()untuk koleksi — lebih ekspresif dari loop manual. Mendukung prefix, postfix, separator, dan transformasi per elemen dalam satu panggilan.filter { }danmap { }pada String — String bisa diproses seperti koleksi karakter."Kotlin".filter { it.isLetter() }mengembalikan String baru yang hanya berisi huruf.padStart()danpadEnd()— berguna untuk format output tabel, nomor dengan leading zero (padStart(5, '0')), dan alignment teks.- Extension function untuk logika domain — buat extension function yang spesifik untuk kebutuhan kamu:
toSlug(),maskAkhir(),toSnakeCase(). Ini membuat kode lebih ekspresif dan reusable.