package ch.std.blog.streamvsfor.array;

import java.util.Arrays;

public class JavaArrayStreamVsFor {
	public static void main(String[] args) {
		int cycles = 1000000;
		int size = 100;
		if (args.length > 0) {
			size = Integer.parseInt(args[0]);
		}
		mapStreamIncrementDemo(cycles, size);
		mapForIncrementDemo(cycles, size);
	}

	public static void mapStreamIncrementDemo(int cycles, int size) {
		int[] numbers = new int[size];
		Arrays.setAll(numbers, j -> j);
		long start = System.currentTimeMillis();
		for (int i = 0; i < cycles; i++) {
			Arrays.stream(numbers).filter(v -> v % 2 == 0).reduce(0, (a, b) -> a + b);
		}
		Integer evenSum = Arrays.stream(numbers).filter(v -> v % 2 == 0).reduce(0, (a, b) -> a + b);
		long end = System.currentTimeMillis();
		System.out.println("map stream, evenSum = " + evenSum + ", time = " + (end - start) + "ms");
	}

	public static void mapForIncrementDemo(int cycles, int size) {
		int[] numbers = new int[size];
		Arrays.setAll(numbers, j -> j);
		long start = System.currentTimeMillis();
		for (int i = 0; i < cycles; i++) {
			int evenSum = 0;
			for (int j = 0; j < numbers.length; j++) {
				if (numbers[j] % 2 == 0) {
					evenSum += numbers[j];
				}
			}
		}
		long end = System.currentTimeMillis();
		int evenSum = 0;
		for (int j = 0; j < numbers.length; j++) {
			numbers[j] = j;
			if (numbers[j] % 2 == 0) {
				evenSum += numbers[j];
			}
		}

		System.out.println("map increment, evenSum = " + evenSum + ", time = " + (end - start) + "ms");
	}
}
