Masukkan Password
32 3.3 Anonymous Function in Dart Programming Language | Functions | Learn Dart Language | Dart Course
Materi kali ini membahas Anonymous Function (fungsi anonim) di Dart.
Caption videonya ada beberapa typo, misalnya “DOT” = Dart, dan istilah for each yang dimaksud adalah forEach().
Kalau materi sebelumnya membahas function yang punya nama seperti main(), add(), dan myFunction(), sekarang kita belajar function yang tidak mempunyai nama.
1. Apa itu Anonymous Function?
Kita sudah terbiasa membuat function seperti:
void sayHello() {
print("Hello");
}
Function ini mempunyai nama:
sayHello
Karena mempunyai nama, kita bisa memanggilnya:
sayHello();
Function seperti ini disebut named function.
Anonymous function
Anonymous berarti tanpa nama.
Contoh:
() {
print("Hello");
}
Perhatikan:
()
Kemudian langsung:
{
print("Hello");
}
Tidak ada nama function seperti:
sayHello
Jadi function tersebut disebut:
Anonymous Function = function yang tidak mempunyai nama.
2. Bandingkan Named Function dan Anonymous Function
Named function
void sayHello() {
print("Hello");
}
Strukturnya:
void
↓
sayHello
↓
()
↓
{}
Ada nama sayHello.
Anonymous function
() {
print("Hello");
}
Strukturnya:
()
↓
{}
Tidak ada nama.
3. Kenapa kita membutuhkan function tanpa nama?
Pertanyaan yang sangat bagus:
“Kalau function tidak punya nama, bagaimana cara menjalankannya?”
Kita tidak bisa memanggilnya dengan:
myFunction();
karena memang tidak ada myFunction.
Biasanya anonymous function digunakan ketika kita ingin:
- memberikan function sebagai nilai,
- memberikan function sebagai argument,
- menjalankan function sebagai callback,
- menggunakan function hanya untuk kebutuhan tertentu,
- terutama pada method seperti
forEach().
Ini akan terasa semakin penting ketika nanti belajar List, callback, asynchronous programming, Flutter, dan sebagainya.
4. Anonymous Function bisa disimpan ke variable
Ini adalah konsep penting dari video.
Di Dart, function juga bisa menjadi sebuah nilai/data.
Contohnya:
Function f = () {
print("I am a function");
};
Mari kita bedah.
Function
adalah tipe data variable.
Kemudian:
f
adalah nama variable.
Lalu:
() {
print("I am a function");
}
adalah anonymous function.
Jadi:
Function f
=
anonymous function
5. Bagaimana menjalankan anonymous function tersebut?
Karena function disimpan di variable f, kita bisa menggunakan f untuk memanggilnya.
Function f = () {
print("I am a function");
};
f();
Output:
I am a function
Perhatikan:
f();
Ini bukan berarti f adalah function yang punya nama.
Sebenarnya f adalah variable yang menyimpan sebuah function.
6. Analogi sederhana
Bayangkan kamu mempunyai sebuah kotak bernama f.
┌─────────────┐
│ f │
│ │
│ FUNCTION │
└─────────────┘
Kita memasukkan function ke dalam kotak tersebut:
Function f = () {
print("Hello");
};
Kemudian ketika kita menulis:
f();
kita berkata:
“Jalankan function yang ada di dalam
f.”
7. Nama variable bisa diganti
Video menunjukkan bahwa kita bisa mengganti:
Function f
menjadi:
Function myFunction
Misalnya:
Function myFunction = () {
print("I am a function");
};
myFunction();
Tetap menghasilkan:
I am a function
Jadi myFunction di sini adalah nama variable, bukan nama dari anonymous function-nya.
8. Anonymous Function juga bisa memiliki parameter
Ini bagian yang penting.
Anonymous function tidak berarti function tersebut tidak boleh mempunyai parameter.
Contohnya:
Function myFunction = (String name) {
print("Hello $name");
};
Function tersebut:
- tidak mempunyai nama function,
- tetapi mempunyai parameter
name.
Kemudian kita bisa memanggil:
myFunction("Budi");
Output:
Hello Budi
9. Alur eksekusinya
Ketika kita menulis:
Function myFunction = (String name) {
print("Hello $name");
};
myFunction("Budi");
alur sederhananya:
myFunction("Budi")
↓
name = "Budi"
↓
print("Hello Budi")
↓
Hello Budi
Jadi anonymous function tetap bisa menerima parameter seperti function biasa.
10. Anonymous Function dan forEach()
Sekarang kita masuk ke bagian yang sangat penting dari video.
Misalnya kita memiliki List:
List<String> fruits = [
"Orange",
"Apple",
"Banana",
];
Kita ingin mencetak semua buah.
Salah satu cara adalah menggunakan for:
for (String fruit in fruits) {
print(fruit);
}
Output:
Orange
Apple
Banana
Tetapi kita juga bisa menggunakan:
fruits.forEach(...);
11. Apa itu forEach()?
forEach() adalah method yang bisa digunakan pada List untuk menjalankan suatu function terhadap setiap elemen.
Misalnya:
fruits.forEach((String fruit) {
print(fruit);
});
Ini mungkin terlihat agak rumit pertama kali.
Mari kita pecah.
Bagian pertama
fruits
adalah List kita:
[
"Orange",
"Apple",
"Banana"
]
Bagian kedua
.forEach()
artinya kita ingin melakukan sesuatu pada setiap elemen.
Bagian ketiga
(String fruit) {
print(fruit);
}
adalah anonymous function.
Function tersebut akan dijalankan untuk setiap elemen.
12. Bagaimana forEach() bekerja?
Misalnya:
List<String> fruits = [
"Orange",
"Apple",
"Banana",
];
fruits.forEach((String fruit) {
print(fruit);
});
Bayangkan forEach() melakukan ini:
Elemen pertama
fruit = "Orange"
kemudian:
print(fruit);
Output:
Orange
Elemen kedua
fruit = "Apple"
Output:
Apple
Elemen ketiga
fruit = "Banana"
Output:
Banana
Jadi secara sederhana:
List
↓
Orange → jalankan function
↓
Apple → jalankan function
↓
Banana → jalankan function
13. Kenapa parameter fruit otomatis berisi setiap buah?
Karena forEach() akan mengirimkan elemen List kepada function yang kita berikan.
Kita memberikan:
(String fruit) {
print(fruit);
}
fruit akan menerima setiap item.
Jadi:
Orange → fruit
Apple → fruit
Banana → fruit
Kemudian function mencetak fruit.
14. Anonymous Function sebagai argument
Nah, ini sebenarnya inti yang lebih besar dari materi video.
Kita bisa mengirim sebuah function ke function lain.
Contoh sederhana:
void myFunction(Function func) {
func();
}
Function myFunction() mempunyai parameter:
Function func
Artinya:
Function ini menerima function sebagai parameter.
15. Memanggilnya dengan anonymous function
Kita bisa:
myFunction(() {
print("I am a function");
});
Perhatikan:
() {
print("I am a function");
}
adalah anonymous function.
Function tersebut kita kirim sebagai argument kepada myFunction().
16. Apa yang terjadi?
Kita punya:
void myFunction(Function func) {
func();
}
Ketika:
myFunction(() {
print("I am a function");
});
dipanggil, anonymous function masuk ke parameter func.
Secara sederhana:
anonymous function
↓
func
↓
func()
↓
print("I am a function")
↓
I am a function
Jadi func() menjalankan anonymous function yang tadi kita kirim.
17. Program lengkap
Contoh dari konsep video:
void myFunction(Function func) {
func();
}
void main() {
myFunction(() {
print("I am a function");
});
}
Output:
I am a function
18. Kenapa ini berguna?
Mungkin kamu berpikir:
“Kenapa tidak langsung
print()saja?”
Untuk contoh sederhana memang terlihat tidak terlalu berguna.
Tetapi konsep ini sangat penting karena memungkinkan kita mengatakan kepada sebuah function:
“Kerjakan tugas utama kamu, dan ketika waktunya tiba, jalankan function yang saya berikan.”
Inilah dasar dari konsep callback.
Misalnya:
FUNCTION A
↓
menerima FUNCTION B
↓
menjalankan FUNCTION B
Jadi function bisa diperlakukan seperti data.
19. Function di Dart adalah first-class object
Ini istilah yang mungkin nanti kamu temui.
Dart memperlakukan function sebagai first-class object.
Artinya function dapat:
- disimpan dalam variable,
- diberikan sebagai argument,
- dikembalikan dari function,
- dipanggil melalui variable.
Contohnya:
Disimpan ke variable
Function f = () {
print("Hello");
};
Dikirim sebagai argument
myFunction(() {
print("Hello");
});
Dipanggil melalui variable
f();
Konsep ini sangat penting untuk memahami Dart lebih lanjut.
20. Anonymous function tidak selalu harus disimpan ke variable
Ini juga penting.
Kita bisa:
Function f = () {
print("Hello");
};
f();
Tetapi kita juga bisa langsung memberikan anonymous function kepada function lain:
myFunction(() {
print("Hello");
});
Jadi anonymous function sering kali dibuat langsung di tempat kita membutuhkannya.
21. Inilah alasan forEach() sering menggunakan anonymous function
Lihat:
fruits.forEach((String fruit) {
print(fruit);
});
Kita sebenarnya berkata kepada forEach():
“Untuk setiap buah, jalankan function ini.”
Function-nya:
(String fruit) {
print(fruit);
}
Tidak perlu diberi nama karena hanya digunakan di situ.
Kalau kita memberi nama:
void printFruit(String fruit) {
print(fruit);
}
kita bisa:
fruits.forEach(printFruit);
Ini juga bisa menjadi pola yang valid.
Tetapi jika function tersebut hanya digunakan sekali, anonymous function sering lebih praktis.
22. Named function vs Anonymous Function pada forEach
Named function
void printFruit(String fruit) {
print(fruit);
}
void main() {
List<String> fruits = [
"Orange",
"Apple",
"Banana",
];
fruits.forEach(printFruit);
}
Function printFruit mempunyai nama.
Anonymous function
void main() {
List<String> fruits = [
"Orange",
"Apple",
"Banana",
];
fruits.forEach((String fruit) {
print(fruit);
});
}
Function tidak mempunyai nama.
Untuk kebutuhan sederhana seperti ini, anonymous function sangat nyaman.
23. Bentuk yang lebih singkat
Nanti kamu juga akan belajar arrow function, sehingga kode seperti:
fruits.forEach((String fruit) {
print(fruit);
});
bisa dibuat lebih singkat:
fruits.forEach((String fruit) => print(fruit));
Ini adalah topik Arrow Function, yang memang menjadi materi berikutnya dalam daftar course.
Jadi jangan khawatir kalau bentuk => ini belum terlalu jelas sekarang.
24. Hal yang sering membuat pemula bingung
Function vs function
Perhatikan:
Function
Huruf F besar.
Ini adalah tipe data untuk function.
Misalnya:
Function myFunction = () {
print("Hello");
};
Sedangkan function dalam pembahasan umum adalah istilah untuk fungsi itu sendiri.
25. Anonymous function tetap bisa memiliki parameter
Jangan berpikir:
Anonymous = tidak punya parameter.
Salah.
Anonymous hanya berarti:
Tidak mempunyai nama.
Contoh:
(String name) {
print("Hello $name");
}
Ini anonymous function yang memiliki parameter.
Bahkan bisa memiliki beberapa parameter:
(int a, int b) {
return a + b;
}
26. Anonymous function juga bisa mempunyai return
Misalnya:
Function add = (int a, int b) {
return a + b;
};
Kemudian:
print(add(10, 20));
Output:
30
Jadi anonymous function dapat memiliki:
- parameter,
- return,
- atau keduanya.
Yang membedakannya hanyalah tidak memiliki nama function.
27. Perhatikan struktur ini
Function add = (int a, int b) {
return a + b;
};
Bacalah dari kiri ke kanan:
Function
↓
tipe variable
add
↓
nama variable
=
↓
isi variable
(int a, int b) {
return a + b;
}
↓
anonymous function
Jadi nama add sebenarnya adalah nama variable, bukan nama anonymous function.
28. Perbedaan penting: function dan hasil function
Perhatikan:
Function f = () {
print("Hello");
};
Di sini:
f
menyimpan function.
Maka:
f();
berarti:
Jalankan function tersebut.
Sedangkan kalau:
String name = "Budi";
name menyimpan String.
Jadi analoginya:
String name = "Budi";
↓
name menyimpan DATA
Function f = () {
print("Hello");
};
↓
f menyimpan FUNCTION
29. Hubungkan dengan materi parameter sebelumnya
Di materi sebelumnya kita belajar:
void greet(String name) {
print("Hello $name");
}
Sekarang kita bisa membuat function tanpa nama:
(String name) {
print("Hello $name");
}
Perbedaannya hanya:
Named:
void greet(String name)
↑
punya nama
Anonymous:
(String name)
↑
tidak punya nama
30. Kesimpulan besar
Ada tiga konsep utama yang perlu kamu pahami dari materi ini.
1. Anonymous Function
Function yang tidak mempunyai nama:
() {
print("Hello");
}
2. Function bisa disimpan dalam variable
Function f = () {
print("Hello");
};
f();
Jadi function bisa diperlakukan seperti sebuah nilai.
3. Function bisa dikirim ke function lain
void myFunction(Function func) {
func();
}
myFunction(() {
print("Hello");
});
Anonymous function dikirim sebagai argument.
31. Ringkasan visual yang perlu kamu ingat
FUNCTION
│
┌─────────┴─────────┐
│ │
Named Function Anonymous Function
│ │
punya nama tidak punya nama
│ │
sayHello() () { ... }
Anonymous function:
ANONYMOUS FUNCTION
│
┌───────┼────────┐
↓ ↓ ↓
disimpan dikirim dipakai
variable sebagai di forEach
argument
Contoh:
Function f = () {
print("Hello");
};
myFunction(() {
print("Hello");
});
fruits.forEach((String fruit) {
print(fruit);
});
🧠 Cara paling gampang mengingat
Kalau kamu melihat:
() {
...
}
atau:
(String name) {
...
}
dan tidak ada nama function di depannya, kemungkinan besar itu adalah anonymous function.
Dan kalau melihat:
fruits.forEach((String fruit) {
print(fruit);
});
ingat kalimat ini:
"
forEach()menerima sebuah function, lalu menjalankan function tersebut untuk setiap item di dalam List."
Itulah salah satu penggunaan anonymous function yang paling penting dan sering kamu temui nanti, terutama ketika masuk lebih jauh ke Dart dan Flutter.