Function Infix Notation
Infix Notation adalah cara penulisan function dengan menempatkan function di antara dua nilai atau object.
Infix notation sering ditemukan pada operasi matematika.
Contohnya:
10 + 20
Operator + berada di antara dua nilai:
10 + 20
│ │
data data
Kotlin juga memungkinkan kita membuat function sendiri yang dapat digunakan menggunakan infix notation.
Contoh Infix Notation
Contoh sederhana:
infix fun String.to(value: String): String {
return if (value == "UP") {
uppercase(java.util.Locale.getDefault())
} else {
lowercase(java.util.Locale.getDefault())
}
}
Function tersebut merupakan Extension Function pada String.
Keyword:
infix
menunjukkan bahwa function tersebut dapat dipanggil menggunakan infix notation.
Memanggil Function dengan Infix Notation
Function to() dapat dipanggil dengan cara:
val name = "Ucup" to "UP"
Perhatikan bahwa kita tidak menggunakan tanda titik:
"Ucup".to("UP")
Keduanya dapat digunakan dan menghasilkan hasil yang sama.
Menggunakan Infix Notation
val name = "Ucup" to "UP"
Menggunakan Pemanggilan Function Biasa
val name = "Ucup".to("UP")
Perbedaannya hanya pada cara penulisan.
Contoh Program Lengkap
infix fun String.to(value: String): String {
return if (value == "UP") {
uppercase(java.util.Locale.getDefault())
} else {
lowercase(java.util.Locale.getDefault())
}
}
fun main() {
val name = "Ucup" to "UP"
println(name)
}
Output:
UCUP
Ketika kode:
"Ucup" to "UP"
dijalankan, Kotlin akan memanggil:
"Ucup".to("UP")
Karena parameter value berisi "UP", kondisi:
value == "UP"
bernilai true.
Kemudian function menjalankan:
uppercase(java.util.Locale.getDefault())
Sehingga:
Ucup
berubah menjadi:
UCUP
Infix Notation dan Extension Function
Pada contoh sebelumnya:
infix fun String.to(value: String): String {
// ...
}
function tersebut merupakan Extension Function.
Receiver type-nya adalah:
String
Sedangkan parameter function adalah:
value: String
Sehingga kita dapat membayangkan struktur function tersebut seperti:
"Ucup" to "UP"
│ │ │
│ │ └── parameter
│ └─────── nama function
└────────────── receiver
Syarat Function Infix
Agar sebuah function dapat digunakan sebagai infix notation, terdapat beberapa aturan.
1. Harus Menggunakan Keyword infix
Contoh:
infix fun String.to(value: String): String {
return "..."
}
Keyword infix harus dituliskan sebelum fun.
2. Harus Memiliki Satu Parameter
Function infix hanya boleh memiliki satu parameter.
Contoh yang benar:
infix fun String.to(value: String): String {
return "..."
}
Contoh yang tidak dapat digunakan sebagai infix:
infix fun String.to(value1: String, value2: String): String {
return "..."
}
Karena memiliki dua parameter.
3. Parameter Tidak Boleh vararg
Parameter infix tidak boleh menggunakan vararg.
Contoh berikut tidak diperbolehkan:
infix fun String.to(vararg values: String): String {
return "..."
}
Function infix hanya boleh memiliki satu parameter biasa.
4. Parameter Tidak Boleh Memiliki Default Value
Parameter pada function infix tidak boleh memiliki nilai default.
Contoh berikut tidak diperbolehkan:
infix fun String.to(value: String = "UP"): String {
return "..."
}
Parameter harus diberikan secara langsung ketika function digunakan.
5. Harus Berupa Member Function atau Extension Function
Function infix harus berupa:
- Member Function
- Extension Function
Pada materi ini kita menggunakan Extension Function.
Contohnya:
infix fun String.to(value: String): String {
return if (value == "UP") {
uppercase(java.util.Locale.getDefault())
} else {
lowercase(java.util.Locale.getDefault())
}
}
Infix Function dengan Kondisi Berbeda
Pada contoh sebelumnya, function memeriksa nilai parameter value.
Jika:
value == "UP"
maka String diubah menjadi huruf besar.
Jika bukan "UP", String diubah menjadi huruf kecil.
Contoh:
infix fun String.to(value: String): String {
return if (value == "UP") {
uppercase(java.util.Locale.getDefault())
} else {
lowercase(java.util.Locale.getDefault())
}
}
Pemanggilan:
val result1 = "Ucup" to "UP"
val result2 = "Ucup" to "DOWN"
println(result1)
println(result2)
Output:
UCUP
ucup
Infix Notation vs Function Biasa
Perhatikan dua cara pemanggilan berikut.
Function Biasa
val name = "Ucup".to("UP")
Infix Notation
val name = "Ucup" to "UP"
Hasil keduanya sama:
UCUP
Infix notation membuat kode terlihat lebih natural untuk operasi tertentu.
Contoh Infix Function Sederhana
Kita dapat membuat Extension Function sederhana untuk menggabungkan dua String.
infix fun String.join(other: String): String {
return "$this $other"
}
Penggunaan dengan function biasa:
val result = "Hello".join("Ucup")
println(result)
Output:
Hello Ucup
Penggunaan dengan infix notation:
val result = "Hello" join "Ucup"
println(result)
Output:
Hello Ucup
Contoh Infix Function pada Int
Infix Function juga dapat dibuat untuk tipe data Int.
Contoh:
infix fun Int.times(value: Int): Int {
return this * value
}
Penggunaan:
val result = 10 times 5
println(result)
Output:
50
Tanpa infix notation:
val result = 10.times(5)
println(result)
Kedua cara tersebut menghasilkan nilai yang sama.
Kapan Menggunakan Infix Function?
Infix Function cocok digunakan ketika sebuah operasi memiliki hubungan yang jelas antara dua nilai.
Contohnya:
10 times 5
atau:
"Hello" join "Ucup"
Infix notation dapat membuat kode terlihat lebih natural dan mudah dibaca.
Namun, tidak semua function harus dibuat menjadi infix.
Jika penggunaan infix membuat kode menjadi sulit dipahami, lebih baik menggunakan pemanggilan function biasa:
object.function(parameter)
Contoh Program Lengkap
Berikut contoh program lengkap:
infix fun String.to(value: String): String {
return if (value == "UP") {
uppercase(java.util.Locale.getDefault())
} else {
lowercase(java.util.Locale.getDefault())
}
}
fun main() {
val name = "Ucup" to "UP"
println(name)
}
Output:
UCUP
Function tersebut juga dapat dipanggil menggunakan cara biasa:
val name = "Ucup".to("UP")
println(name)
Hasilnya tetap:
UCUP
Kesimpulan
Infix Notation adalah cara khusus untuk memanggil function dengan menempatkan function di antara receiver dan parameter.
Contoh:
"Ucup" to "UP"
Sama dengan:
"Ucup".to("UP")
Untuk membuat function infix, gunakan keyword:
infix
Contoh:
infix fun String.to(value: String): String {
return if (value == "UP") {
uppercase(java.util.Locale.getDefault())
} else {
lowercase(java.util.Locale.getDefault())
}
}
Beberapa aturan utama:
- Function harus menggunakan keyword
infix. - Harus berupa member function atau extension function.
- Harus memiliki tepat satu parameter.
- Parameter tidak boleh menggunakan
vararg. - Parameter tidak boleh memiliki default value.
Dengan Infix Notation, pemanggilan function tertentu dapat ditulis dengan lebih natural:
val name = "Ucup" to "UP"
daripada:
val name = "Ucup".to("UP")