import java.util.stream.IntStream;

public class PerbandinganHasil {

    public static void main(String[] args) {
        int batas = 1_000_000;

        // sum: operasi asosiatif, paralel tetap menjawab sama.
        // mapToLong menghindari overflow karena total melewati rentang int.
        long jumlahSekuensial = IntStream.rangeClosed(1, batas)
            .mapToLong(n -> (long) n * 3).sum();
        long jumlahParalel = IntStream.rangeClosed(1, batas).parallel()
            .mapToLong(n -> (long) n * 3).sum();
        System.out.println("sekuensial = " + jumlahSekuensial);
        System.out.println("paralel    = " + jumlahParalel);
        System.out.println("identik    = " + (jumlahSekuensial == jumlahParalel));

        // reduce: identitas nol + Integer::sum yang asosiatif
        int reduceSekuensial = IntStream.rangeClosed(1, 1000)
            .reduce(0, Integer::sum);
        int reduceParalel = IntStream.rangeClosed(1, 1000).parallel()
            .reduce(0, Integer::sum);
        System.out.println("reduce sekuensial = " + reduceSekuensial);
        System.out.println("reduce paralel    = " + reduceParalel);
        System.out.println("reduce identik    = " + (reduceSekuensial == reduceParalel));
    }
}
