import java.util.List;
import java.util.Optional;

public class PencarianSiswa {

    record Siswa(String nama, String kelas, int nilai) {}

    // Versi null: ketiadaan hasil hanya diketahui lewat kebiasaan memeriksa
    static Siswa cariDenganNull(List<Siswa> daftar, String nama) {
        for (Siswa s : daftar) {
            if (s.nama().equals(nama)) {
                return s;
            }
        }
        return null;
    }

    // Versi Optional: ketiadaan hasil dinyatakan di tipe kembalian
    static Optional<Siswa> cariSiswa(List<Siswa> daftar, String nama) {
        return daftar.stream()
            .filter(s -> s.nama().equals(nama))
            .findFirst();
    }

    public static void main(String[] args) {
        List<Siswa> rombongan = List.of(
            new Siswa("Budi", "X-2", 78),
            new Siswa("Siti", "X-2", 92),
            new Siswa("Dewi", "XI-3", 85)
        );

        // Pola lama: pemanggil wajib ingat memeriksa null
        Siswa hasilNull = cariDenganNull(rombongan, "Ani");
        if (hasilNull != null) {
            System.out.println("versi null   = " + hasilNull.nama());
        } else {
            System.out.println("versi null   = tidak ditemukan");
        }

        // Versi Optional: map lalu orElse sebagai nilai cadangan
        String kelasBudi = cariSiswa(rombongan, "Budi")
            .map(Siswa::kelas)
            .orElse("tidak terdaftar");
        System.out.println("kelas Budi   = " + kelasBudi);

        String kelasAni = cariSiswa(rombongan, "Ani")
            .map(Siswa::kelas)
            .orElse("tidak terdaftar");
        System.out.println("kelas Ani    = " + kelasAni);

        // filter: pipeline hanya berlanjut bila syarat terpenuhi
        cariSiswa(rombongan, "Siti")
            .filter(s -> s.nilai() >= 90)
            .ifPresent(s -> System.out.println("nilai Siti   = " + s.nilai() + " (berprestasi)"));

        cariSiswa(rombongan, "Budi")
            .filter(s -> s.nilai() >= 90)
            .ifPresent(s -> System.out.println("nilai Budi   = " + s.nilai()));
    }
}
