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

public class PengelompokanSiswa {

    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("Ani", "XI-3", 85),
            new Siswa("Rahmat", "XII-1", 88)
        );

        // groupingBy dasar: kelas -> daftar Siswa
        Map<String, List<Siswa>> perKelas = rombongan.stream()
            .collect(Collectors.groupingBy(Siswa::kelas));
        System.out.println("perKelas = " + perKelas);

        // groupingBy + counting: kelas -> jumlah siswa
        Map<String, Long> jumlahPerKelas = rombongan.stream()
            .collect(Collectors.groupingBy(Siswa::kelas, Collectors.counting()));
        System.out.println("jumlahPerKelas = " + jumlahPerKelas);

        // groupingBy + mapping: kelas -> daftar nama saja
        Map<String, List<String>> namaPerKelas = rombongan.stream()
            .collect(Collectors.groupingBy(Siswa::kelas,
                Collectors.mapping(Siswa::nama, Collectors.toList())));
        System.out.println("namaPerKelas = " + namaPerKelas);
    }
}
