Learn
← Previous Next →

Hari 13: Generics & Collections Lanjutan

60 min Last updated 09 Apr 2026

Generics

class Stack {
  List _items = [];

  void push(T item) => _items.add(item);
  T pop() {
    if (_items.isEmpty) throw StateError("Stack kosong!");
    return _items.removeLast();
  }
  T get peek => _items.last;
  bool get isEmpty => _items.isEmpty;
  int get size => _items.length;
}

void main() {
  Stack stackAngka = Stack();
  stackAngka.push(10);
  stackAngka.push(20);
  stackAngka.push(30);
  print("Peek: ${stackAngka.peek}"); // 30
  print("Pop: ${stackAngka.pop()}"); // 30
  print("Size: ${stackAngka.size}"); // 2

  Stack stackKata = Stack();
  stackKata.push("Hello");
  stackKata.push("World");
  print("Pop: ${stackKata.pop()}"); // World
}

Set — Koleksi Unik

void main() {
  Set bahasa = {"Dart", "Python", "JavaScript"};
  bahasa.add("Dart");     // duplikat diabaikan
  bahasa.add("Go");
  print(bahasa);           // {Dart, Python, JavaScript, Go}
  print(bahasa.contains("Go")); // true

  Set a = {1, 2, 3, 4};
  Set b = {3, 4, 5, 6};
  print(a.intersection(b)); // {3, 4}
  print(a.union(b));         // {1, 2, 3, 4, 5, 6}
  print(a.difference(b));    // {1, 2}
}

Functional Collection Methods

void main() {
  List> mahasiswa = [
    {"nama": "Andi", "ipk": 3.8, "jurusan": "IF"},
    {"nama": "Budi", "ipk": 2.9, "jurusan": "SI"},
    {"nama": "Cika", "ipk": 3.5, "jurusan": "IF"},
    {"nama": "Dani", "ipk": 3.2, "jurusan": "SI"},
  ];

  // Filter mahasiswa IF dengan IPK >= 3.5
  var terbaik = mahasiswa
    .where((m) => m["jurusan"] == "IF" && m["ipk"] >= 3.5)
    .map((m) => "${m["nama"]} (${m["ipk"]})")
    .toList();

  print(terbaik); // [Andi (3.8), Cika (3.5)]

  // Hitung rata-rata IPK
  double rataIPK = mahasiswa
    .map((m) => m["ipk"] as double)
    .reduce((a, b) => a + b) / mahasiswa.length;
  print("Rata IPK: $rataIPK");
}

💡 Notice: .. (cascade) memungkinkan chaining method yang return void seperti sort().

Assignment

Hilangkan duplikat, urutkan, filter > 3, lalu kalikan 2.

Expected output:

Original: [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
Unik & sorted: [1, 2, 3, 4, 5, 6, 9]
Filter > 3: [4, 5, 6, 9]
Dikali 2: [8, 10, 12, 18]
Dart main.dart
Solution
Output