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

public class LaporanNilai {

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

    public static void main(String[] args) {
        List<Siswa> rombongan = List.of(
            new Siswa("Budi", "10A", 78),
            new Siswa("Siti", "10A", 92),
            new Siswa("Dewi", "10A", 85),
            new Siswa("Ani", "10A", 74)
        );

        // joining: gabungkan nama dengan pemisah, prefiks, dan sufiks
        String daftarNama = rombongan.stream()
            .map(Siswa::nama)
            .collect(Collectors.joining(", ", "Siswa: [", "]"));
        System.out.println(daftarNama);

        // counting: jumlah elemen sebagai Long
        Long jumlah = rombongan.stream().collect(Collectors.counting());
        System.out.println("Jumlah siswa: " + jumlah);

        // summingInt dan averagingInt
        Integer total = rombongan.stream().collect(Collectors.summingInt(Siswa::nilai));
        Double rataRata = rombongan.stream().collect(Collectors.averagingInt(Siswa::nilai));
        System.out.println("Total nilai: " + total);
        System.out.printf("Rata-rata: %.2f%n", rataRata);

        // maxBy dan minBy menghasilkan Optional<Siswa>
        Comparator<Siswa> byNilai = Comparator.comparingInt(Siswa::nilai);
        Optional<Siswa> tertinggi = rombongan.stream().collect(Collectors.maxBy(byNilai));
        Optional<Siswa> terendah = rombongan.stream().collect(Collectors.minBy(byNilai));
        tertinggi.ifPresent(s -> System.out.println("Nilai tertinggi: " + s.nama() + " (" + s.nilai() + ")"));
        System.out.println("Nilai terendah: " + terendah.map(Siswa::nama).orElse("tidak ada data"));
    }
}
