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

public class PembagianLulus {

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

    public static void main(String[] args) {
        List<Siswa> rombongan = List.of(
            new Siswa("Budi", "XII-1", 78),
            new Siswa("Siti", "X-2", 92),
            new Siswa("Dewi", "X-2", 70),
            new Siswa("Rahmat", "XII-1", 60)
        );

        // partitioningBy dasar: Map<Boolean, List<Siswa>>
        Map<Boolean, List<Siswa>> pembagian = rombongan.stream()
            .collect(Collectors.partitioningBy(s -> s.nilai() >= 75));
        System.out.println("Lulus: " + pembagian.get(true));
        System.out.println("Remedial: " + pembagian.get(false));

        // partitioningBy dengan downstream counting
        Map<Boolean, Long> jumlah = rombongan.stream()
            .collect(Collectors.partitioningBy(s -> s.nilai() >= 75,
                Collectors.counting()));
        System.out.println("jumlah = " + jumlah);

        // Stream kosong tetap menghasilkan kedua kunci
        Map<Boolean, List<Siswa>> kosong = List.<Siswa>of().stream()
            .collect(Collectors.partitioningBy(s -> s.nilai() >= 75));
        System.out.println("kosong = " + kosong);
    }
}
