Hello World & dasar
Program Kotlin dimulai di fungsi main tingkat atas, tanpa perlu class.
| Sintaks | Arti |
|---|
fun main() { println("Hello") } | Titik masuk program |
println("text") | Mencetak satu baris ke standard output |
print("text") | Mencetak tanpa baris baru di akhir |
// comment | Komentar satu baris |
/* comment */ | Komentar beberapa baris |
val input = readLine() | Membaca satu baris dari stdin (nullable String?) |
val line = readln() | Membaca satu baris dari stdin (non-null, Kotlin 1.6+) |
Variabel (val / var) & tipe
Utamakan val; pakai var hanya saat nilainya harus berubah.
| Sintaks | Arti |
|---|
val name = "Ada" | Variabel read-only, tipenya disimpulkan sebagai String |
var count = 0 | Variabel yang bisa diubah |
val age: Int = 30 | Anotasi tipe eksplisit |
Int, Long, Double, Float | Tipe angka (42, 42L, 3.14, 3.14f) |
Boolean, Char, String | true/false, 'a', "text" |
val big = 1_000_000 | Garis bawah agar literal mudah dibaca |
"3".toInt(), "2.5".toDouble() | Mengubah string menjadi angka |
42.toString() | Angka ke string |
const val MAX = 10 | Konstanta saat compile (di tingkat atas atau di dalam object) |
String & template
String template menggantikan penggabungan string hampir di mana saja.
| Sintaks | Arti |
|---|
"Hi, $name" | Menyisipkan variabel ke dalam string |
"Total: ${price * qty}" | Menyisipkan ekspresi |
s.length | Jumlah karakter |
s.uppercase(), s.lowercase() | Mengubah huruf besar/kecil |
s.trim() | Menghapus spasi di awal dan akhir |
s.contains("x"), s.startsWith("a") | Mencari di dalam string |
s.substring(0, 3) | Memotong berdasarkan rentang indeks |
s.split(",") | Memecah menjadi List<String> |
s[0] | Karakter di sebuah indeks |
"""raw text""" | String mentah beberapa baris, tanpa escape |
"%.2f".format(3.14159) | Output dengan format (3.14) |
Null safety
Sebuah tipe bersifat non-null secara default; tambahkan ? untuk mengizinkan null, dan compiler memaksamu menanganinya.
| Sintaks | Arti |
|---|
var s: String? = null | Tipe nullable |
s?.length | Safe call: mengembalikan null jika s bernilai null |
s?.length ?: 0 | Operator Elvis: nilai cadangan saat null |
s!!.length | Not-null assertion: melempar error jika s bernilai null |
if (s != null) s.length | Smart cast ke non-null di dalam pemeriksaan |
s?.let { println(it) } | Menjalankan blok hanya jika tidak null |
val n = s?.toIntOrNull() | Mengubah ke angka, atau null jika input tidak valid |
lateinit var x: String | Var non-null yang diinisialisasi belakangan |
Operator
| Operator | Arti |
|---|
+ - * / % | Aritmetika (/ pada Int adalah pembagian bilangan bulat) |
+= -= *= /= %= | Penugasan gabungan |
++ -- | Increment / decrement |
== != | Kesamaan struktural (memanggil equals) |
=== !== | Kesamaan referensial (object yang sama) |
< > <= >= | Perbandingan |
&& || ! | Logika and / or / not |
a in 1..10 | Keanggotaan dalam range atau collection |
x as Int, x as? Int | Cast / safe cast (null jika gagal) |
x is String | Pemeriksaan tipe (smart cast jika berhasil) |
Alur kontrol (if / when)
if dan when adalah ekspresi: keduanya mengembalikan nilai.
| Sintaks | Arti |
|---|
if (a > b) x else y | if sebagai ekspresi (Kotlin tidak punya ternary ?:) |
if (c) { ... } else if (d) { ... } else { ... } | Cabang berantai |
when (x) { 1 -> "one"; 2 -> "two"; else -> "other" } | Mencocokkan sebuah nilai |
when (x) { 1, 2 -> "low" } | Beberapa nilai dalam satu cabang |
when (x) { in 1..9 -> "digit" } | Mencocokkan range |
when (x) { is String -> x.length } | Mencocokkan tipe (dengan smart cast) |
when { x < 0 -> "neg"; x == 0 -> "zero"; else -> "pos" } | when tanpa subjek, seperti if/else if |
val label = when (x) { ... } | when sebagai ekspresi (butuh else) |
Perulangan & range
| Sintaks | Arti |
|---|
for (i in 1..5) | Range inklusif 1 sampai 5 |
for (i in 1 until 5) | 1 sampai 4 (ujung akhir tidak termasuk) |
for (i in 0..<5) | Sama, dengan sintaks range terbuka (Kotlin 1.9+) |
for (i in 10 downTo 1 step 2) | Menghitung mundur dengan langkah tertentu |
for (item in list) | Iterasi collection |
for ((i, item) in list.withIndex()) | Indeks dan elemen sekaligus |
for (ch in "abc") | Iterasi karakter sebuah string |
while (cond) { ... } | Mengulang selama bernilai true |
do { ... } while (cond) | Dijalankan minimal sekali |
break, continue | Keluar dari perulangan / lompat ke iterasi berikutnya |
repeat(3) { println(it) } | Menjalankan blok sebanyak n kali |
Fungsi
| Sintaks | Arti |
|---|
fun add(a: Int, b: Int): Int { return a + b } | Mendeklarasikan fungsi |
fun add(a: Int, b: Int) = a + b | Fungsi satu ekspresi, tipe kembaliannya disimpulkan |
fun greet(name: String = "world") | Nilai parameter default |
greet(name = "Ada") | Argumen bernama |
fun log(vararg items: String) | Jumlah argumen yang bervariasi |
fun say(): Unit | Tanpa nilai kembalian (Unit boleh tidak ditulis) |
val square = { x: Int -> x * x } | Lambda yang disimpan di variabel |
fun String.shout() = uppercase() + "!" | Extension function |
fun apply(f: (Int) -> Int) = f(2) | Fungsi sebagai parameter |
list.map { it * 2 } | Trailing lambda, it adalah parameter tunggalnya |
List
listOf bersifat read-only; mutableListOf bisa diubah.
| Sintaks | Arti |
|---|
val nums = listOf(1, 2, 3) | List read-only |
val items = mutableListOf("a") | List yang bisa diubah |
nums[0], nums.first(), nums.last() | Mengakses elemen |
nums.getOrNull(9) | Akses aman, null jika di luar rentang |
items.add("b"), items.remove("a") | Menambah / menghapus |
items[0] = "z" | Mengganti lewat indeks |
nums.size, nums.isEmpty() | Ukuran dan kekosongan |
x in nums, nums.contains(x) | Keanggotaan |
nums.indexOf(2) | Posisi sebuah elemen, -1 jika tidak ada |
nums.subList(0, 2) | Potongan (ujung akhir tidak termasuk) |
nums.take(2), nums.drop(1) | n elemen pertama / semua kecuali n elemen pertama |
nums.sorted(), nums.reversed() | List baru yang diurutkan / dibalik |
nums.sum(), nums.average(), nums.maxOrNull() | Agregat |
nums.joinToString(", ") | Menggabungkan menjadi satu string |
Pair(1, "a"), 1 to "a", Triple(1, 2, 3) | Tuple kecil berukuran tetap |
Map & set
| Sintaks | Arti |
|---|
val m = mapOf("a" to 1, "b" to 2) | Map read-only |
val mm = mutableMapOf<String, Int>() | Map yang bisa diubah |
m["a"] | Pencarian (null jika tidak ada) |
m.getOrDefault("z", 0) | Pencarian dengan nilai cadangan |
mm["c"] = 3 | Menyisipkan atau memperbarui |
for ((k, v) in m) | Iterasi entry dengan destructuring |
m.keys, m.values | Collection berisi key / value |
"a" in m | Keanggotaan key |
val s = setOf(1, 2, 2) | Set berisi nilai unik ({1, 2}) |
mutableSetOf<Int>() | Set yang bisa diubah |
Operasi collection (lambda)
| Sintaks | Arti |
|---|
list.map { it * 2 } | Mengubah setiap elemen |
list.filter { it > 2 } | Menyisakan elemen yang cocok |
list.forEach { println(it) } | Melakukan sesuatu pada setiap elemen |
list.any { it > 2 }, list.all { it > 0 } | Apakah ada / semua elemen cocok |
list.count { it % 2 == 0 } | Menghitung yang cocok |
list.find { it > 2 } | Kecocokan pertama atau null |
list.sortedBy { it.length } | Mengurutkan berdasarkan key |
list.groupBy { it.first() } | Mengelompokkan menjadi Map |
list.distinct() | Menghapus duplikat |
list.fold(0) { acc, x -> acc + x } | Reduce dengan nilai awal |
list.zip(other) | Memasangkan dua list |
list.flatMap { it.toList() } | Map lalu diratakan (flatten) |
Class & data class
| Sintaks | Arti |
|---|
class User(val name: String, var age: Int) | Class dengan primary constructor dan property |
val u = User("Ada", 36) | Membuat instance (tanpa new) |
u.name, u.age = 37 | Membaca / menulis property |
data class Point(val x: Int, val y: Int) | equals, hashCode, toString, copy langsung tersedia |
p.copy(y = 5) | Menyalin dengan sebagian property diubah |
val (x, y) = p | Deklarasi destructuring |
open class Base, class Sub : Base() | Inheritance (class bersifat final secara default) |
override fun toString() = "..." | Override anggota |
object Config { val debug = true } | Singleton |
companion object { fun create() = User("", 0) } | Anggota mirip static |
enum class Color { RED, GREEN } | Enum |
sealed class Result | Hierarki class terbatas, lengkap di dalam when |
interface Shape { fun area(): Double } | Interface |
Penanganan error
| Sintaks | Arti |
|---|
try { ... } catch (e: Exception) { ... } | Menangkap exception |
try { ... } finally { ... } | Selalu menjalankan pembersihan |
val n = try { s.toInt() } catch (e: NumberFormatException) { 0 } | try sebagai ekspresi |
throw IllegalArgumentException("bad") | Melempar exception |
require(x > 0) { "x must be positive" } | Pemeriksaan argumen (melempar IllegalArgumentException) |
check(ready) { "not ready" } | Pemeriksaan state (melempar IllegalStateException) |
s.toIntOrNull() | Mengembalikan null alih-alih melempar exception |
runCatching { risky() }.getOrDefault(0) | Membungkus pemanggilan dalam Result |
Scope function
Lima fungsi bantu kecil untuk bekerja dengan sebuah object di dalam blok.
| Sintaks | Arti |
|---|
x.let { it + 1 } | it adalah object-nya, mengembalikan hasil blok |
x.run { this + 1 } | this adalah object-nya, mengembalikan hasil blok |
x.apply { field = 1 } | this adalah object-nya, mengembalikan object itu |
x.also { println(it) } | it adalah object-nya, mengembalikan object itu |
with(x) { field } | Bukan extension; this adalah x, mengembalikan hasil blok |
x?.let { ... } | Cara idiomatis untuk memeriksa null lalu memakainya |
Semua sintaks Kotlin yang sering kamu pakai, dalam satu halaman. Cheat sheet Kotlin ini adalah referensi cepat untuk bahasa di balik Android dan sebagian besar JVM modern: mendeklarasikan variabel, menangani null dengan aman, membuat percabangan dengan when, perulangan atas range, menulis fungsi, serta bekerja dengan list dan map.
Semua yang ada di sini adalah Kotlin standar dan berjalan di JVM, Android, maupun Kotlin Multiplatform. Salin yang kamu butuhkan, atau coba langsung di playground Kotlin: tempel potongan kode, tekan Jalankan, dan lihat output-nya di browsermu.