Masukkan Password
31 Anonymous Function in Dart | Lambda Function| Dart Tutorial #30
Materi ini membahas anonymous function atau lambda function di Dart. Konsep ini sangat penting karena nanti di Flutter kamu akan sering sekali melihat bentuk seperti:
() {
// kode
}
terutama pada forEach(), onPressed, onTap, setState, callback, dan berbagai API Flutter lainnya.
Ada beberapa bagian transcript yang agak kurang tepat secara teknis, jadi saya akan jelaskan sekaligus meluruskannya.
1. Apa itu Anonymous Function?
Anonymous function adalah function yang tidak memiliki nama.
Biasanya kita membuat function seperti ini:
int cube(int n) {
return n * n * n;
}
Function tersebut mempunyai nama:
cube
Jadi kita bisa memanggilnya:
print(cube(3));
Hasil:
27
Sedangkan anonymous function tidak mempunyai nama:
(int n) {
return n * n * n;
}
Perhatikan:
(int n) {
return n * n * n;
}
Tidak ada:
cube
Itulah sebabnya disebut anonymous = tanpa nama.
2. Kenapa Function Tanpa Nama Dibuat?
Pertanyaan yang sangat bagus:
“Kalau tidak punya nama, lalu bagaimana cara menjalankannya?”
Ada dua cara utama:
Cara 1 — Disimpan ke dalam variable
Misalnya:
var cube = (int n) {
return n * n * n;
};
Sekarang anonymous function tersebut disimpan di variable:
cube
Sehingga kita bisa memanggilnya:
print(cube(3));
Hasil:
27
Cara 2 — Langsung diberikan ke function lain
Misalnya:
names.forEach((name) {
print(name);
});
Anonymous function:
(name) {
print(name);
}
langsung diberikan sebagai argument kepada forEach().
Ini justru salah satu penggunaan anonymous function yang paling sering kamu temui di Flutter.
3. Anonymous Function Tidak Berarti Tidak Punya Return Type
Transcript mengatakan kurang lebih:
“for this function you cannot specify a return type”
Ini perlu diluruskan.
Anonymous function memang tidak mempunyai nama, tetapi bukan berarti return type-nya tidak bisa diketahui atau tidak bisa ditulis dalam bentuk tertentu.
Contohnya:
(int n) {
return n * n * n;
}
Dart dapat menginfer bahwa function tersebut mengembalikan int.
Kamu biasanya tidak perlu menuliskan:
int
di depan anonymous function seperti function biasa.
Function bernama:
int cube(int n) {
return n * n * n;
}
Anonymous function:
(int n) {
return n * n * n;
}
Jadi perbedaan utamanya adalah nama function-nya tidak ada.
4. Bentuk Dasar Anonymous Function
Bentuk sederhananya:
(parameter) {
// isi function
}
Misalnya:
(int number) {
print(number);
}
Strukturnya:
(int number) → parameter
{ → awal body
print(number);
} → akhir body
Kalau tidak membutuhkan parameter:
() {
print("Hello");
}
Tidak ada parameter di dalam ().
5. Anonymous Function Harus Diakhiri ;?
Ini juga perlu sedikit diluruskan.
Kalau anonymous function berdiri sebagai expression yang di-assign ke variable:
var cube = (int n) {
return n * n * n;
};
memang ada ; setelah }.
Kenapa?
Karena keseluruhan:
var cube = ...;
adalah sebuah statement assignment.
Tapi kalau anonymous function langsung diberikan sebagai argument:
names.forEach((name) {
print(name);
});
} tidak diikuti ; secara langsung. Ada ); karena kita sedang menutup pemanggilan forEach().
Jadi jangan menghafal:
“Setiap anonymous function harus selalu diikuti semicolon.”
Lebih tepat:
Tanda
;mengikuti statement atau expression tempat anonymous function tersebut digunakan.
6. Contoh Pertama: Anonymous Function Disimpan ke Variable
Mari kita lihat contoh dari transcript.
var cube = (int n) {
return n * n * n;
};
Apa yang terjadi?
Kita mempunyai anonymous function:
(int n) {
return n * n * n;
}
Function tersebut kita simpan ke:
cube
Sehingga sekarang:
cube
↓
Function
↓
menerima int
↓
menghasilkan int
Kemudian:
print(cube(3));
Dart menjalankan function tersebut dengan:
n = 3
Kemudian:
3 * 3 * 3
hasilnya:
27
Jadi output:
27
7. Variable cube Isinya Bukan Angka
Ini bagian yang sangat penting.
Ketika kita menulis:
var cube = (int n) {
return n * n * n;
};
cube bukan integer.
Misalnya bukan:
cube = 27;
Melainkan cube menyimpan sebuah function.
Secara konsep:
cube
↓
function
Karena function adalah first-class object di Dart.
Artinya function dapat diperlakukan seperti data biasa.
Function bisa:
- disimpan dalam variable
- diberikan sebagai argument
- dikembalikan oleh function lain
8. Bisa Menuliskan Tipe Function Secara Eksplisit
Transcript juga menunjukkan bahwa variable tersebut dapat diberi tipe Function.
Misalnya:
Function cube = (int n) {
return n * n * n;
};
Artinya:
cube adalah variable bertipe Function
Tetapi ada cara yang lebih bagus dan lebih spesifik.
Kita bisa menulis:
int Function(int) cube = (int n) {
return n * n * n;
};
Ini mungkin terlihat aneh untuk pemula, jadi mari kita pecahkan.
int Function(int)
dibaca:
“Sebuah function yang menerima
intdan mengembalikanint.”
Jadi:
int Function(int) cube
artinya:
cube
↓
function
↓
input: int
↓
output: int
Contohnya:
int Function(int) cube = (int n) {
return n * n * n;
};
print(cube(3));
Output:
27
9. Function vs Function Type yang Spesifik
Kamu mungkin bertanya:
“Kalau bisa pakai
Function, kenapa harus pakaiint Function(int)?”
Karena Function terlalu umum.
Contoh:
Function cube = (int n) {
return n * n * n;
};
Dart hanya tahu:
cubeadalah sebuah function.
Sedangkan:
int Function(int) cube = (int n) {
return n * n * n;
};
Dart tahu lebih detail:
cubeadalah function yang menerimaintdan menghasilkanint.
Ini membantu type safety dan membuat kode lebih jelas.
10. Anonymous Function Bisa Memiliki Parameter
Contohnya:
var greet = (String name) {
print("Hello $name");
};
Kemudian:
greet("Budi");
Output:
Hello Budi
Walaupun greet adalah variable, kita bisa memanggilnya seperti function:
greet("Budi");
11. Anonymous Function Tanpa Parameter
Anonymous function tidak harus mempunyai parameter.
Contoh:
var sayHello = () {
print("Hello!");
};
Kemudian:
sayHello();
Output:
Hello!
Bentuknya:
() {
print("Hello!");
}
() kosong berarti function tersebut tidak menerima parameter.
12. Anonymous Function dengan Banyak Parameter
Misalnya:
var add = (int a, int b) {
return a + b;
};
Kemudian:
print(add(10, 20));
Output:
30
Strukturnya:
add
↓
Function
↓
int a + int b
↓
return int
13. Anonymous Function Sangat Berkaitan dengan Callback
Sekarang kita masuk ke bagian yang sangat penting untuk Flutter.
Istilah yang akan sering kamu dengar adalah:
callback
Callback secara sederhana adalah:
function yang diberikan kepada function lain untuk dijalankan nanti atau pada kondisi tertentu.
Contoh:
void execute(Function callback) {
callback();
}
Kemudian:
execute(() {
print("Hello");
});
Di sini:
() {
print("Hello");
}
adalah anonymous function.
Kita memberikannya kepada:
execute()
Jadi:
anonymous function
↓
diberikan
↓
execute()
↓
dipanggil
↓
print("Hello")
14. Contoh Penting: forEach()
Sekarang kita masuk ke contoh transcript.
Misalnya kita mempunyai:
List<String> names = [
"Andi",
"Budi",
"Citra",
];
Kita ingin mencetak semua nama.
Kita bisa menggunakan:
names.forEach((name) {
print(name);
});
Output:
Andi
Budi
Citra
15. Apa yang Sebenarnya Terjadi di forEach()?
Bagian ini harus benar-benar dipahami.
Kita mempunyai:
names.forEach((name) {
print(name);
});
forEach() membutuhkan sebuah function sebagai argument.
Anonymous function-nya adalah:
(name) {
print(name);
}
Jadi secara konsep:
names
↓
forEach()
↓
minta function
↓
anonymous function diberikan
Kemudian forEach() akan menjalankan function tersebut untuk setiap item.
Misalnya list:
[
"Andi",
"Budi",
"Citra"
]
Maka kira-kira prosesnya:
name = "Andi"
↓
print("Andi")
name = "Budi"
↓
print("Budi")
name = "Citra"
↓
print("Citra")
16. Parameter name Itu Dari Mana?
Ini pertanyaan yang sering muncul.
Kita menulis:
names.forEach((name) {
print(name);
});
Tapi kita tidak pernah menulis:
name = "Andi";
Lalu dari mana name mendapatkan nilainya?
Jawabannya:
forEach() yang memberikan nilai tersebut kepada callback.
Misalnya list:
[
"Andi",
"Budi",
"Citra"
]
Maka forEach() secara konsep melakukan sesuatu seperti:
callback("Andi")
callback("Budi")
callback("Citra")
Sehingga anonymous function:
(name) {
print(name);
}
menerima:
"Andi"
"Budi"
"Citra"
secara bergantian.
17. Bandingkan dengan Function Bernama
Kita bisa membuat function biasa:
void printName(String name) {
print(name);
}
Kemudian:
names.forEach(printName);
Ini juga bisa.
Jadi ada dua pendekatan.
Function bernama
void printName(String name) {
print(name);
}
names.forEach(printName);
Anonymous function
names.forEach((name) {
print(name);
});
Hasilnya sama:
Andi
Budi
Citra
18. Kapan Menggunakan Anonymous Function?
Anonymous function sangat cocok ketika function tersebut:
- hanya digunakan satu kali
- pendek
- tidak perlu diberi nama
- digunakan sebagai callback
Misalnya:
names.forEach((name) {
print(name);
});
Kalau function-nya hanya digunakan di situ, membuat function terpisah:
void printName(String name) {
print(name);
}
kadang justru terasa berlebihan.
19. Contoh dengan Kondisi
Misalnya kita mempunyai:
List<int> numbers = [1, 2, 3, 4, 5];
Kita bisa:
numbers.forEach((number) {
if (number % 2 == 0) {
print(number);
}
});
Output:
2
4
Anonymous function:
(number) {
if (number % 2 == 0) {
print(number);
}
}
diberikan kepada:
forEach()
20. Anonymous Function vs Function Biasa
Bandingkan.
Function biasa
int cube(int n) {
return n * n * n;
}
print(cube(3));
Function mempunyai nama:
cube
Anonymous function
var cube = (int n) {
return n * n * n;
};
print(cube(3));
Function tidak mempunyai nama, tetapi disimpan di:
cube
Perhatikan perbedaan penting:
Pada contoh kedua, cube adalah nama variable, bukan nama function.
Ini konsep yang sangat bagus untuk dipahami.
21. Anonymous Function vs Arrow Function
Di Dart ada bentuk yang lebih singkat yang disebut arrow function atau arrow syntax.
Misalnya:
var cube = (int n) {
return n * n * n;
};
Bisa ditulis lebih singkat:
var cube = (int n) => n * n * n;
Keduanya menghasilkan hal yang sama.
print(cube(3));
Output:
27
Kenapa bisa disingkat?
Karena:
(int n) {
return n * n * n;
}
hanya mempunyai satu expression yang dikembalikan.
Bentuk:
(int n) => n * n * n
berarti kira-kira:
(int n) {
return n * n * n;
}
22. Arrow Function Bukan Function yang Berbeda
Ini penting.
Jangan berpikir:
anonymous function
dan:
arrow function
adalah dua jenis function yang sepenuhnya berbeda.
Arrow syntax adalah cara penulisan singkat untuk function yang body-nya berupa satu expression.
Contoh:
var add = (int a, int b) => a + b;
Sama konsepnya dengan:
var add = (int a, int b) {
return a + b;
};
23. Contoh yang Sangat Sering Muncul di Flutter
Nanti ketika belajar Flutter, kamu akan melihat kode seperti:
ElevatedButton(
onPressed: () {
print("Button ditekan");
},
child: Text("Klik"),
)
Perhatikan:
onPressed: () {
print("Button ditekan");
}
Itu adalah anonymous function.
Kita tidak membuat:
void buttonPressed() {
print("Button ditekan");
}
lalu memberikan:
onPressed: buttonPressed
Kita langsung memberikan function:
() {
print("Button ditekan");
}
Inilah salah satu alasan anonymous function sangat penting dalam Flutter.
24. Contoh onTap
Misalnya:
GestureDetector(
onTap: () {
print("Container ditekan");
},
child: Container(),
)
Bagian:
() {
print("Container ditekan");
}
adalah anonymous function yang diberikan sebagai callback untuk onTap.
Artinya secara sederhana:
“Flutter, ketika
onTapterjadi, jalankan function ini.”
25. Kenapa Callback Sangat Penting di Flutter?
Flutter banyak menggunakan konsep:
event
↓
callback
↓
kode dijalankan
Misalnya:
User klik button
↓
onPressed
↓
anonymous function
↓
jalankan kode
Atau:
User tap layar
↓
onTap
↓
anonymous function
↓
jalankan kode
Jadi ketika kamu sudah memahami anonymous function, kamu akan jauh lebih mudah memahami banyak kode Flutter.
26. Analogi Sederhana
Bayangkan kamu punya sebuah restoran.
Function bernama seperti pegawai yang punya nama:
Pegawai "Budi"
Kamu bisa berkata:
“Budi, kerjakan tugas ini.”
Sedangkan anonymous function seperti:
“Hei, siapa saja yang bertugas di sini, lakukan tugas berikut.”
Kita tidak peduli siapa namanya. Yang penting tugasnya.
Dalam programming:
(name) {
print(name);
}
kita tidak peduli function itu bernama apa.
Kita hanya peduli:
“Ketika kamu menerima sebuah
name, lakukanprint(name).”
27. Konsep Besarnya
Coba lihat keseluruhan konsep ini:
var cube = (int n) {
return n * n * n;
};
Di sini:
(int n) → parameter
{ ... } → function body
return ... → hasil
cube → variable yang menyimpan function
Kemudian:
cube(3);
berarti:
Jalankan function yang disimpan di
cubedengan argument3.
Sedangkan:
names.forEach((name) {
print(name);
});
berarti:
names
↓
forEach()
↓
menerima callback
↓
anonymous function
↓
dijalankan untuk setiap name
28. Hal yang Harus Kamu Ingat
Kalau diringkas, ada beberapa poin utama:
1. Anonymous function = function tanpa nama
(int x) {
return x * 2;
}
2. Bisa disimpan ke variable
var doubleNumber = (int x) {
return x * 2;
};
Kemudian:
print(doubleNumber(5));
Output:
10
3. Function adalah object di Dart
Function bisa:
disimpan
↓
dikirim sebagai argument
↓
dikembalikan sebagai return value
4. Anonymous function sering digunakan sebagai callback
Contoh:
names.forEach((name) {
print(name);
});
5. Flutter sangat sering menggunakan anonymous function
Contoh:
onPressed: () {
print("Button ditekan");
}
6. Arrow syntax adalah versi singkat
(int x) => x * 2
setara dengan:
(int x) {
return x * 2;
}
29. Cheat Sheet
| Bentuk | Arti |
|---|---|
void test() {} | Function bernama |
() {} | Anonymous function tanpa parameter |
(int x) {} | Anonymous function dengan 1 parameter |
(int a, int b) {} | Anonymous function dengan 2 parameter |
() => print("Hello") | Anonymous function dengan arrow syntax |
var f = () {} | Anonymous function disimpan ke variable |
list.forEach((item) {}) | Anonymous function sebagai callback |
onPressed: () {} | Anonymous callback di Flutter |
Kesimpulan paling sederhana
Kalau kamu menemukan kode:
() {
print("Hello");
}
bacalah sebagai:
“Ini adalah sebuah function, tetapi function ini tidak memiliki nama.”
Kalau kamu menemukan:
var f = () {
print("Hello");
};
bacalah:
“Saya membuat anonymous function dan menyimpannya ke variable
f.”
Kalau menemukan:
names.forEach((name) {
print(name);
});
bacalah:
“Saya memberikan sebuah anonymous function kepada
forEach(), laluforEach()akan menjalankan function tersebut untuk setiap item.”
Dan kalau nanti di Flutter kamu melihat:
onPressed: () {
print("Klik");
}
bacalah:
“Ketika tombol ditekan, jalankan anonymous function ini.”
Inti yang paling penting: Anonymous function = function tanpa nama, dan penggunaan terbesarnya adalah sebagai callback. Di Flutter, konsep callback ini akan muncul sangat sering, jadi memahami materi ini akan menjadi bekal penting untuk materi Flutter berikutnya.