package com.levelup.java.collections;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.math3.stat.StatUtils;
import org.junit.Before;
import org.junit.Test;

/**
 * This java example will demonstrate how to 
 * sum values in a list.
 * 
 * @author Justin Musgrove
 * @see <a href='http://www.leveluplunch.com/java/examples/sum-values-in-arraylist/'>Sum values in list</a>
 */
public class SumValueInList {

	private static List<Double> NUMBERS_FOR_SUM;
	
	@Before
	public void setup () {
		NUMBERS_FOR_SUM = new ArrayList<Double>();
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
		NUMBERS_FOR_SUM.add(new Double(10));
	}

	
	@Test
	public void sum_values_in_list_java () {
		
	     Double sum = new Double(0); 
	     for (Double i : NUMBERS_FOR_SUM) {
	    	 sum = sum + i;
	     }
	         
		assertEquals(100, sum, 0);
	}
	
	@Test
	public void sum_values_in_list_java_8() {

		double sum = NUMBERS_FOR_SUM.stream().reduce(0d, (a, b) -> a + b);

		assertEquals(100, sum, 0);

		// or

		double sum2 = NUMBERS_FOR_SUM
				.stream()
				.mapToDouble(Double::doubleValue)
				.sum();

		assertEquals(100, sum2, 0);
	}

	@Test
	public void sum_values_in_list_apache() {

		double[] arrayToSume = ArrayUtils.toPrimitive(NUMBERS_FOR_SUM
				.toArray(new Double[NUMBERS_FOR_SUM.size()]));

		double sum = StatUtils.sum(arrayToSume);

		assertEquals(100, sum, 0);
	}
	
}