Mengungkap Misteri Lenyapnya Looping ‘for’ Di Groovy


Memakai struktur data Collection,  termasuk juga array,  adalah hal yang sering saya alami.   Pada bahasa pemograman Java, untuk membaca dan menulis Collection,  saya harus melakukan looping dengan keyword for.  Sebagai contoh, ini adalah kode program Java yang membaca dan menampilkan ArrayList:

Collection bahasa = new ArrayList();
bahasa.add("Java");
bahasa.add("Groovy");
bahasa.add("C");
bahasa.add("C++");
bahasa.add("PHP");
for (String b: bahasa) {
   System.out.println(b);
}

Sebenarnya kode program di atas juga dapat dipakai pada Groovy, karena for tetap ada di Groovy.   Walaupun demikian, ada cara yang lebih mudah dalam melakukan looping,  yaitu dengan menggunakan method each() dari Collection tersebut.   Method each() menerima argumen berupa sebuah closure yang akan dikerjakan untuk setiap item dalam Collection.   Berikut ini adalah contoh kode program Groovy yang melakukan hal serupa:

def bahasa = ["Java", "Groovy", "C", "C++", "PHP"]
bahasa.each { println it }

Cukup dua baris, tanpa memakai looping for!   Pada closure untuk each(),  variabel it merujuk pada item yang sedang ditelusuri.   Bila ingin memperjelas makna it, misalnya memberi tipe data dan nama berbeda, saya dapat mengubahnya menjadi seperti berikut ini:

def bahasa = ["Java", "Groovy", "C", "C++", "PHP"]
bahasa.each { String b -> println b }

Bagaimana bila saya ingin melakukan perulangan angka berurut,  apakah tetap harus memakai for?   Misalnya seperti pada kode program Java berikut ini:

for (int i=0; i<10; i++) {
   System.out.println("Nilai: " + i);
}

Groovy memiliki Collection khusus yang disebut Range untuk mewakili nilai berurut.   Misalnya,  kode program di atas akan mencetak 0 sampai 9, sehingga dapat diwakili dengan range 0..<10.   Notasi ..< menunjukkan bahwa ’10’  tidak menjadi bagian dari range tersebut.   0..<10 pada dasarnya sama dengan 0..9 (versi ini lebih jelas).   Karena Range juga adalah sebuah Collection, maka looping bisa dilakukan dengan method each() seperti yang terlihat pada kode program berikut ini:

(0..9).each { println "Nilai: $it" }

Ok, bagaimana bila saya ingin mencetak nilai index untuk Collection,  misalnya pada kode program Java berikut ini:

List bahasa = new ArrayList();
bahasa.add("Java");
bahasa.add("Groovy");
bahasa.add("C");
bahasa.add("C++");
bahasa.add("PHP");
for (int i=0; i<bahasa.size(); i++) { 
   System.out.println("Index " + i + " adalah " + bahasa.get(i)) 
}

Pada Groovy, saya bisa memakai method eachWithIndex() untuk melakukan hal serupa,  seperti yang terlihat pada kode program berikut ini:

def bahasa = ["Java", "Groovy", "C", "C++", "PHP"] 
bahasa.eachWithIndex { String entry, int i ->
   println "Index $i adalah $entry"
}

Semua telah dilalui tanpa memakai syntax for di Groovy.   Lalu, bagaimana bila saya ingin mengubah nilai yang ada pada Collection tersebut?  Parameter yang dilewatkan oleh each() pastinya tidak dapat dipakai untuk mengubah nilai original, bukan?   Misalnya,  dengan syntax for di Java, saya dapat melakukan hal berikut ini:

List bahasa = new ArrayList();
bahasa.add("Java");
bahasa.add("Groovy");
bahasa.add("C");
bahasa.add("C++");
bahasa.add("PHP");
for (int i=0; i<bahasa.size(); i++) {
   String b = bahasa.get(i);
   bahasa.set(i, "Bahasa " + b);
}
for (String b: bahasa) {
   System.out.println(b);
}

Pada kode program di atas,  saya menambahkan “Bahasa” pada setiap item yang ada di dalam Collection.   Apakah Groovy bisa melakukannya tanpa harus menggunakan syntax for?   Yup, bisa!   Saya bisa menggunakan method collect() yang akan menghasilkan sebuah Collection baru setelah modifikasi setiap itemnya,  seperti yang terlihat pada kode program berikut ini:

def bahasa = ["Java", "Groovy", "C", "C++", "PHP"]
bahasa = bahasa.collect { "Bahasa $it" }
bahasa.each { println it}

Groovy juga menambahkan banyak “gula pemanis” pada Collection sehingga kode program bisa lebih ringkas tanpa kehilangan makna.   Berikut ini adalah contoh “manisan” pada kode program Groovy yang bisa membuat ketagihan:

def bahasa = ["Java", "Groovy", "C", "C++", "PHP"]

// membuang elemen di Collection
bahasa -= ["C++", "PHP"]

// menambah elemen baru di Collection
bahasa += ["Assembly", "C#"]

// mengurutkan elemen
bahasa.sort()

// mencari elemen yang diawakili huruf C atau G
// output:
// C
// C#
// Groovy
bahasa.findAll { it ==~ /[CG].*/ }.each { println it }

// memakai masing-masing item Collection sebagai argumen dengan spread operator
// Output:
// Saya terbiasa memakai Assembly, baru belajar C, tertarik pada C# dan Groovy, sering mendengar Java
printf("Saya terbiasa memakai %s, baru belajar %s, tertarik pada %s dan %s, sering mendengar %s\n", *bahasa)

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: