List
List sesuai namanya dapat menampung banyak data ke dalam satu objek. Dalam kehidupan sehari-hari kita menggunakan list untuk menyimpan daftar belanja, nomor telepon, dsb. Begitu pula dengan Dart kita bisa menyimpan bermacam-macam tipe data seperti string, number, dan boolean. Cara penulisannya pun sangat mudah. Perhatikan saja contoh berikut:
- List<int> numberList = [1, 2, 3, 4, 5];
Kode di atas adalah contoh dari satu objek List yang berisi kumpulan data dengan tipe integer. Karena kompiler bisa mengetahui tipe data yang ada dalam sebuah objek List, maka tak perlu kita menuliskannya secara eksplisit.
- var numberList = [1, 2, 3, 4, 5];
- var stringList = ['Hello', 'Dicoding', 'Dart'];
Sesuai contoh di atas, kita mendefinisikan tipe data yang bisa dimasukkan ke dalam List di dalam tanda kurung siku ([ ]). Sama seperti variabel, jika kita tidak mendefinisikan nilai secara eksplisit ke dalam List, maka List akan menyimpan tipe dynamic atau bisa menyimpan semua tipe data.
Ketika bermain dengan sebuah List, tentunya ada saat di mana kita ingin mengakses posisi tertentu dari List tersebut. Untuk melakukannya, kita bisa menggunakan fungsi indexing seperti berikut:
- void main() {
- List dynamicList = [1, 'Dicoding', true];
- print(dynamicList[1]);
- }
- // Output: Dicoding
Perhatikan kode di atas. Fungsi indexing ditandai dengan tanda [ ]. Jika Anda mengira bahwa konsol akan menampilkan angka 1, tebakan Anda kurang tepat. Dalam sebuah List, indeks dimulai dari 0. Maka ketika kita akan mengakses data pada dynamicList yang berada pada indeks ke-1, artinya data tersebut merupakan data pada posisi ke-2. Jadi data yang akan ditampilkan pada konsol adalah Dicoding.
Lalu apa yang akan terjadi jika kita berusaha menampilkan item dari List yang berada di luar dari ukuran List tersebut? Sebagai contoh, Anda ingin mengakses indeks ke-3 dari dynamicList:
- print(dynamicList[3]);
Hasilnya adalah eror! Kompiler akan memberitahukan bahwa perintah itu tidak bisa dijalankan. Berikut pesan eror yang akan muncul:
Unhandled exception:
RangeError (index): Invalid value: Not in range 0..2, inclusive: 3
Pesan di atas memberitahu kita bahwa List telah diakses dengan indeks ilegal. Ini akan terjadi jika indeks yang kita inginkan negatif atau lebih besar dari atau sama dengan ukuran List tersebut.
Masih ingat looping? Untuk menampilkan seluruh item dari list kita bisa memanfaatkan looping. Contohnya perhatikan kode berikut:
- void main() {
- List<String> stringList = ["Hello", "Dicoding", "Dart"];
- for (int i = 0; i < stringList.length; i++) {
- print(stringList[i]);
- }
- }
- // Output:
- // Hello
- // Dicoding
- // Dart
Pada kode di atas kita memanfaatkan perulangan sebanyak jumlah data di dalam list untuk mencetak data yang ada di dalam list. Banyaknya data di dalam list bisa kita panggil melalui properti .length.
Selain itu kita juga bisa menggunakan fungsi foreach untuk menampilkan data di dalam list.
Mekanisme di atas dikenal sebagai lambda atau anonymous function. Kita akan mempelajarinya lebih dalam pada modul yang akan datang.
Sejauh ini kita baru belajar menginisialisasikan dan mengakses data dari sebuah List. Pastinya Anda bertanya, “Bagaimana kita memanipulasi data pada List tersebut?” Nah, untuk menambahkan data ke dalam list, kita bisa menggunakan fungsi add().
Fungsi add ini akan menambahkan data di akhir list. Sehingga ketika dicetak, konsol akan menampilkan data berikut:
- [Hello, Dicoding, Dart, Flutter]
Lalu bagaimana jika kita ingin menambahkan data namun tidak di akhir List? Jawabannya adalah dengan fungsi insert. Di dalam fungsi insert kita perlu memasukkan 2 parameter, yaitu indeks list dan data yang akan dimasukkan.
- void main() {
- List<String> stringList = ["Hello", "Dicoding", "Dart", "Flutter"];
- // Menambahkan data di indeks ke-0.
- stringList.insert(0, 'Programming');
- print(stringList);
- }
- /// Output:
- /// [Programming, Hello, Dicoding, Dart, Flutter]
Untuk mengubah nilai di dalam list, kita bisa langsung menginisialisasikan nilai baru sesuai indeks yang diinginkan.
- stringList[1] = 'Application';
Sedangkan untuk menghapus data terdapat beberapa fungsi remove yang bisa kita gunakan, antara lain:
Spread Operator
Dart memiliki fitur menarik untuk menambahkan banyak nilai ke dalam List dengan cara yang singkat, yaitu spread operator.
Sesuai namanya “spread”, fitur ini digunakan untuk menyebarkan nilai di dalam collections menjadi beberapa elemen. Spread operator dituliskan dengan tiga titik (...). Mari kita lihat contoh kode berikut:
- void main() {
- var favorites = ['Seafood', 'Salad', 'Nugget', 'Soup'];
- var others = ['Cake', 'Pie', 'Donut'];
- var allFavorites = [favorites, others];
- print(allFavorites);
- }
- /// Output:
- /// [[Seafood, Salad, Nugget, Soup], [Cake, Pie, Donut]]
Nilai List tidak akan tergabung. Alih-alih menggabungkan nilainya, variabel allFavorites menjadi List yang menampung dua List di dalamnya. Nah, dengan spread operator kita dapat menggabungkan kedua List di atas:
Yup, dengan spread operator kita dapat memasukkan masing-masing elemen di dalam List ke dalam List lainnya.
Untuk mengatasi List yang bisa bernilai null, kita dapat menggunakan null-aware spread operator (...?) seperti berikut:
- void main() {
- List<dynamic>? list;
- List<dynamic>? list2 = [0, ...?list];
- print(list2);
- }
- /// Output:
- /// [0]
Jika ingin melihat sumber dari keseluruhan interactive code di atas, Anda dapat mengunjungi tautan berikut.
Untuk memperdalam materi mengenai List, Anda dapat membaca tautan berikut.