import java.util.stream.IntStream;
import java.util.stream.Stream;

public class JejakBoxing {

    static int kotakDibuat = 0;

    // Kelas pembungkus sederhana, meniru objek hasil boxing Integer
    static final class Angka {
        final int nilai;

        Angka(int nilai) {
            kotakDibuat++;
            this.nilai = nilai;
        }
    }

    public static void main(String[] args) {
        int n = 1000;

        // 1. Stream berisi objek pembungkus: n objek dialokasikan di heap
        kotakDibuat = 0;
        int totalObjek = Stream.generate(() -> new Angka(1))
            .limit(n)
            .mapToInt(a -> a.nilai)
            .sum();
        System.out.println("Stream<Angka>  : total = " + totalObjek
            + ", objek dibuat = " + kotakDibuat);

        // 2. Stream primitif: nol objek pembungkus
        kotakDibuat = 0;
        int totalPrimitif = IntStream.rangeClosed(1, n)
            .map(x -> 1)
            .sum();
        System.out.println("IntStream      : total = " + totalPrimitif
            + ", objek dibuat = " + kotakDibuat);
    }
}
