Modul 13: Static and Collection - IvanSholana/Pemrograman-Berbasis-Objek-Sistem-Informasi GitHub Wiki

1. Konsep static dalam Java

Kata kunci static digunakan untuk mendefinisikan anggota (variabel, metode, atau blok) yang terikat langsung dengan kelas itu sendiri, bukan dengan objek yang diciptakan dari kelas tersebut. Artinya, semua objek yang dibuat dari kelas yang sama akan berbagi variabel atau metode yang sama jika ditandai sebagai static.

a. Variabel Static

Variabel static hanya ada satu untuk setiap kelas, terlepas dari berapa banyak objek yang dibuat dari kelas itu. Variabel static biasanya digunakan untuk menyimpan nilai yang perlu dibagikan di antara semua instance (objek) kelas tersebut, seperti penghitung atau konstanta umum.

Contoh Penggunaan Variabel Static

class Karyawan {
    static int jumlahKaryawan = 0; // Variabel static
    
    Karyawan() {
        jumlahKaryawan++; // Menambah jumlah setiap kali objek baru dibuat
    }
    
    static void tampilkanJumlahKaryawan() {
        System.out.println("Jumlah karyawan: " + jumlahKaryawan);
    }
}

public class Main {
    public static void main(String[] args) {
        new Karyawan();
        new Karyawan();
        Karyawan.tampilkanJumlahKaryawan(); // Output: Jumlah karyawan: 2
    }
}

Di sini, jumlahKaryawan akan terus bertambah setiap kali objek baru Karyawan dibuat, karena variabel tersebut adalah variabel static.

b. Metode Static

Metode static adalah metode yang bisa dipanggil langsung dari kelas tanpa perlu membuat objek. Metode static hanya bisa mengakses variabel static lain atau metode static lainnya di dalam kelas.

Contoh Penggunaan Metode Static

class Matematika {
    static int kuadrat(int angka) {
        return angka * angka;
    }
    
    static int pangkatTiga(int angka) {
        return angka * angka * angka;
    }
}

public class Main {
    public static void main(String[] args) {
        int hasilKuadrat = Matematika.kuadrat(4); // Output: 16
        int hasilPangkatTiga = Matematika.pangkatTiga(3); // Output: 27
        System.out.println("Kuadrat: " + hasilKuadrat);
        System.out.println("Pangkat Tiga: " + hasilPangkatTiga);
    }
}

Dalam contoh ini, metode static kuadrat dan pangkatTiga dapat dipanggil langsung dari kelas Matematika tanpa harus membuat objek baru.

c. Blok Static

Blok static digunakan untuk melakukan inisialisasi statis. Blok ini dieksekusi satu kali, yaitu saat kelas pertama kali di-load ke dalam JVM, sebelum konstruktor dijalankan.

Contoh Penggunaan Blok Static

class Inisialisasi {
    static int angka;
    
    static {
        angka = 100; // Inisialisasi variabel static
        System.out.println("Blok static dijalankan. Angka: " + angka);
    }
}

public class Main {
    public static void main(String[] args) {
        new Inisialisasi(); // Blok static akan dieksekusi sekali sebelum objek dibuat
    }
}

2. Konsep Collection dalam Java

Java Collection Framework adalah sekumpulan kelas dan antarmuka yang digunakan untuk menyimpan dan mengelola data dalam struktur yang berbeda. Collection menyediakan cara untuk menyimpan, mengakses, memanipulasi, dan mengelola kumpulan objek dengan lebih mudah dan efisien.

a. List

List adalah tipe collection yang menyimpan elemen secara berurutan dan memungkinkan duplikasi data. Implementasi populer dari List meliputi ArrayList, LinkedList, dan Vector.

Contoh Penggunaan List

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> namaList = new ArrayList<>();
        namaList.add("Irfan");
        namaList.add("Sholana");
        namaList.add("Irfan"); // Duplikasi diperbolehkan

        for (String nama : namaList) {
            System.out.println(nama);
        }
    }
}

b. Set

Set adalah tipe collection yang tidak mengizinkan adanya elemen duplikat. Implementasi populer dari Set meliputi HashSet, LinkedHashSet, dan TreeSet.

Contoh Penggunaan Set

import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<String> namaSet = new HashSet<>();
        namaSet.add("Irfan");
        namaSet.add("Sholana");
        namaSet.add("Irfan"); // Elemen ini akan diabaikan karena sudah ada dalam set

        for (String nama : namaSet) {
            System.out.println(nama); // Output tanpa duplikasi
        }
    }
}

c. Map

Map adalah tipe collection yang menyimpan pasangan key-value. Setiap key harus unik, tetapi nilai (value) dapat memiliki duplikat. Implementasi populer dari Map meliputi HashMap, LinkedHashMap, dan TreeMap.

Contoh Penggunaan Map

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> umurMap = new HashMap<>();
        umurMap.put("Irfan", 25);
        umurMap.put("Sholana", 24);
        umurMap.put("Irfan", 26); // Nilai sebelumnya akan diganti dengan 26

        for (Map.Entry<String, Integer> entry : umurMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

d. Contoh Penggunaan Static dan Collection Bersama

Kita bisa menggabungkan static dengan Collection untuk mengelola data bersama yang berkaitan dengan kelas tertentu. Contoh sederhana berikut adalah untuk menyimpan daftar karyawan yang dikelola secara static.

import java.util.ArrayList;
import java.util.List;

class Karyawan {
    private String nama;
    private static List<Karyawan> daftarKaryawan = new ArrayList<>(); // Collection static

    public Karyawan(String nama) {
        this.nama = nama;
        daftarKaryawan.add(this); // Menambah karyawan ke daftar saat dibuat
    }

    public static void tampilkanDaftarKaryawan() {
        System.out.println("Daftar Karyawan:");
        for (Karyawan karyawan : daftarKaryawan) {
            System.out.println(karyawan.nama);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        new Karyawan("Irfan");
        new Karyawan("Sholana");
        Karyawan.tampilkanDaftarKaryawan(); // Output: Daftar karyawan yang dibuat
    }
}

1. Filtering Data dengan Collection

Filtering adalah proses memilih elemen-elemen dari koleksi yang memenuhi kriteria tertentu. Di Java, kita bisa menggunakan berbagai metode, salah satunya adalah Stream API yang diperkenalkan di Java 8.

a. Menggunakan Stream untuk Filtering

Stream memungkinkan kita untuk memproses data secara deklaratif, seperti menggunakan kondisi tertentu untuk memilih elemen dari koleksi. Fungsi filter pada Stream digunakan untuk menyaring elemen berdasarkan kondisi.

Contoh Filtering dengan Stream:

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> angkaList = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // Menyaring angka yang lebih besar dari 5
        List<Integer> hasilFilter = angkaList.stream()
                                             .filter(angka -> angka > 5)
                                             .collect(Collectors.toList());

        System.out.println(hasilFilter); // Output: [6, 7, 8, 9, 10]
    }
}

Penjelasan:

  • stream(): Mengubah koleksi menjadi stream untuk diproses.
  • filter(): Memilih elemen yang memenuhi kondisi yang diberikan (dalam hal ini, angka lebih besar dari 5).
  • collect(Collectors.toList()): Mengumpulkan hasil filter menjadi koleksi lagi (List).

b. Filtering dengan Kondisi Lebih Kompleks

Kita juga bisa melakukan filter dengan kondisi lebih kompleks, seperti memfilter objek berdasarkan atributnya.

Contoh Filtering Objek dengan Stream:

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

class Karyawan {
    String nama;
    int umur;

    Karyawan(String nama, int umur) {
        this.nama = nama;
        this.umur = umur;
    }

    @Override
    public String toString() {
        return nama + " (" + umur + " tahun)";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Karyawan> karyawanList = new ArrayList<>();
        karyawanList.add(new Karyawan("Irfan", 25));
        karyawanList.add(new Karyawan("Sholana", 28));
        karyawanList.add(new Karyawan("Rina", 23));
        karyawanList.add(new Karyawan("Budi", 30));

        // Menyaring karyawan yang berusia lebih dari 25
        List<Karyawan> hasilFilter = karyawanList.stream()
                                                 .filter(karyawan -> karyawan.umur > 25)
                                                 .collect(Collectors.toList());

        System.out.println(hasilFilter); // Output: [Sholana (28 tahun), Budi (30 tahun)]
    }
}

2. Sorting Data dengan Collection

Sorting adalah proses mengurutkan elemen dalam koleksi. Di Java, kita dapat mengurutkan elemen menggunakan Stream API atau dengan menggunakan Collections.sort().

a. Menggunakan Stream untuk Sorting

Stream menyediakan metode sorted() yang dapat digunakan untuk mengurutkan elemen dalam koleksi berdasarkan urutan natural atau kriteria yang kita tentukan.

Contoh Sorting dengan Stream:

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> angkaList = List.of(9, 4, 2, 7, 5, 1, 8, 3, 6);

        // Mengurutkan angka secara ascending
        List<Integer> hasilSort = angkaList.stream()
                                          .sorted()
                                          .collect(Collectors.toList());

        System.out.println(hasilSort); // Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    }
}

b. Mengurutkan Secara Descending

Untuk mengurutkan secara descending (dari terbesar ke terkecil), kita bisa menggunakan Comparator.reverseOrder().

Contoh Sorting Descending dengan Stream:

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        List<Integer> angkaList = List.of(9, 4, 2, 7, 5, 1, 8, 3, 6);

        // Mengurutkan angka secara descending
        List<Integer> hasilSort = angkaList.stream()
                                          .sorted(Comparator.reverseOrder())
                                          .collect(Collectors.toList());

        System.out.println(hasilSort); // Output: [9, 8, 7, 6, 5, 4, 3, 2, 1]
    }
}

c. Sorting Objek dengan Kriteria Tertentu

Kita bisa menggunakan Comparator untuk mengurutkan objek berdasarkan salah satu atau lebih atributnya.

Contoh Sorting Objek dengan Comparator:

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.Comparator;

class Karyawan {
    String nama;
    int umur;

    Karyawan(String nama, int umur) {
        this.nama = nama;
        this.umur = umur;
    }

    @Override
    public String toString() {
        return nama + " (" + umur + " tahun)";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Karyawan> karyawanList = new ArrayList<>();
        karyawanList.add(new Karyawan("Irfan", 25));
        karyawanList.add(new Karyawan("Sholana", 28));
        karyawanList.add(new Karyawan("Rina", 23));
        karyawanList.add(new Karyawan("Budi", 30));

        // Mengurutkan karyawan berdasarkan umur secara ascending
        List<Karyawan> hasilSort = karyawanList.stream()
                                              .sorted(Comparator.comparingInt(karyawan -> karyawan.umur))
                                              .collect(Collectors.toList());

        System.out.println(hasilSort); // Output: [Rina (23 tahun), Irfan (25 tahun), Sholana (28 tahun), Budi (30 tahun)]
    }
}

3. Menggabungkan Filtering dan Sorting

Kita dapat menggabungkan proses filtering dan sorting dalam satu alur pemrosesan menggunakan Stream.

Contoh Filtering dan Sorting Bersama-sama:

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.Comparator;

class Karyawan {
    String nama;
    int umur;

    Karyawan(String nama, int umur) {
        this.nama = nama;
        this.umur = umur;
    }

    @Override
    public String toString() {
        return nama + " (" + umur + " tahun)";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Karyawan> karyawanList = new ArrayList<>();
        karyawanList.add(new Karyawan("Irfan", 25));
        karyawanList.add(new Karyawan("Sholana", 28));
        karyawanList.add(new Karyawan("Rina", 23));
        karyawanList.add(new Karyawan("Budi", 30));

        // Menyaring karyawan yang berusia lebih dari 25 dan mengurutkannya berdasarkan umur
        List<Karyawan> hasil = karyawanList.stream()
                                          .filter(karyawan -> karyawan.umur > 25)
                                          .sorted(Comparator.comparingInt(karyawan -> karyawan.umur))
                                          .collect(Collectors.toList());

        System.out.println(hasil); // Output: [Sholana (28 tahun), Budi (30 tahun)]
    }
}

Iya, benar! Dalam contoh kode tersebut, angka adalah elemen atau anggota dari list.

Lebih tepatnya, ketika kita menggunakan filter(angka -> angka % 2 == 0), kita sedang melakukan iterasi (penyaringan) terhadap setiap elemen dalam stream yang berasal dari koleksi (dalam hal ini list). Setiap elemen dalam list akan diproses oleh angka -> angka % 2 == 0, yang berarti jika elemen tersebut habis dibagi 2 (angka genap), maka elemen tersebut akan disertakan dalam hasil stream.

Berikut adalah potongan kodenya:

List<Integer> angkaList = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// Menggunakan filter untuk menyaring angka genap
List<Integer> angkaGenap = angkaList.stream()
                                    .filter(angka -> angka % 2 == 0)  // "angka" di sini adalah elemen dalam list
                                    .collect(Collectors.toList());

System.out.println(angkaGenap);  // Output: [2, 4, 6, 8, 10]
  • angka -> angka % 2 == 0 adalah ekspresi lambda yang menerima satu parameter (angka), yang dalam hal ini merujuk pada elemen dalam stream, dan memeriksa apakah elemen tersebut adalah angka genap.
  • Setelah filter diterapkan, hanya angka yang memenuhi kondisi (yaitu angka genap) yang akan disertakan dalam hasil akhir.
⚠️ **GitHub.com Fallback** ⚠️