Pages

Wednesday, November 3, 2021

Java 8 Stream Sum - Adding Numbers With Java Streams

1. Overview

In this article, we'll learn how to add the numbers in java using java 8 streams summing and reduce() methods.

To make the examples simple, we are going to write code based in the integer values.

Java 8 Stream Sum - Adding Numbers With Java Streams


2. Sum using Java Stream.reduce()

First, Stream api has a reduce() method which takes the accumulator as an argument. reduce() method is a terminal operation which means reduce() method produces the result from stream and this should be called at the end of the stream.

reduce() method takes the two numbers such as number 1 and number 2. These two numbers are taken and applied the logic of addition what we write. 

Please refer the following example program.

package com.javaprogramto.java8.streams.sum;

import java.util.Arrays;
import java.util.List;

public class IntegerSumExample1 {

	public static void main(String[] args) {

		List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
		
		int totalSum = numbers.stream().reduce(0, (number1, number2) -> number1 + number2);
		
		System.out.println("Sum of integers : "+totalSum);
	}
}
 

Output

Sum of integers : 55

 

Instead of passing "(number1, number2) -> number1 + number2)" logic to the reduce method, you can add this logic in the new method and call the new method as below. There will be no change in the output. In this way, we can reuse the add() method from many stream operations.

public class IntegerSumExample1 {

	public static void main(String[] args) {

		List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

		int totalSum = numbers.stream().reduce(0, ArithmeticUtils::add);

		System.out.println("Sum of integers : " + totalSum);
	}

}

class ArithmeticUtils {

	public static int add(int number1, int number2) {
		return number1 + number2;
	}
}
 

Additionally, you can use the builtin method Integer::sum from the reduce() method.

3. Using Collectors.summingInt()

Another way to add the list of integers is using the summingInt() of Collectors api.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int summingIntValue = numbers.stream().collect(Collectors.summingInt(Integer::intValue));

System.out.println("Sum of integers using summingInt : " + summingIntValue);

 

Output: 

Sum of integers using summingInt : 55
 

In the similar to the summingInt(), there are separate methods to deal with the addition of long and double such as summingDouble() and summingLong().

4. Using IntStream.sum()

Next, Using IntStream api sum() method, we can get the addition of numbers from the list or map.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int intStreamSum = numbers.stream().mapToInt(Integer::intValue).sum();
System.out.println("IntStream sum : "+intStreamSum);


Output:

IntStream sum : 55


5. Stream Sum with Map values

Let us see now to get the sum of value of Map object. First we need to get the values list or set from the map and then apply any one of the methods what we have learnt so far.

Map<Double, Integer> map = new HashMap<>();
map.put(1.0, 100);
map.put(2.0, 200);
map.put(3.0, 300);
map.put(4.0, 400);

int mapValuesSum = map.values().stream().reduce(0, Integer::sum);
System.out.println("Map values sum : "+mapValuesSum);

Output: 

Map values sum : 1000


6. Stream sum with custom objects

Next, create the set of objects then add them to the list. Further apply all of these ways on the list.

List<Employee> emps = Arrays.asList(new Employee(100, "A", 25), new Employee(200, "B", 35),
		new Employee(300, "C", 45));

int sum = emps.stream().map(emp -> emp.getAge())
			  .reduce(0, (a, b) -> a + b);

sum = emps.stream().map(emp -> emp.getAge())
		  .mapToInt(Integer::intValue)
		  .sum();

sum = emps.stream().map(emp -> emp.getAge())
		  .collect(Collectors.summingInt(Integer::intValue));


All above ways produces the same output as sum value 105.


7. Full code Stream Sum Example

All the examples are shown are put together in the single program.

package com.javaprogramto.java8.streams.sum;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.javaprogramto.models.Employee;

public class IntegerSumExample1 {

	public static void main(String[] args) {

		List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

		// reduce() example
		int totalSum = numbers.stream().reduce(0, ArithmeticUtils::add);
		System.out.println("Sum of integers : " + totalSum);

		// summingInt() example
		int summingIntValue = numbers.stream().collect(Collectors.summingInt(Integer::intValue));
		System.out.println("Sum of integers using summingInt : " + summingIntValue);

		// IntStream sum() example
		int intStreamSum = numbers.stream().mapToInt(Integer::intValue).sum();
		System.out.println("IntStream sum : " + intStreamSum);

		Map<Double, Integer> map = new HashMap<>();
		map.put(1.0, 100);
		map.put(2.0, 200);
		map.put(3.0, 300);
		map.put(4.0, 400);

		int mapValuesSum = map.values().stream().reduce(0, Integer::sum);
		System.out.println("Map values sum : " + mapValuesSum);

		List<Employee> emps = Arrays.asList(new Employee(100, "A", 25), new Employee(200, "B", 35),
				new Employee(300, "C", 45));
		
		int sum = emps.stream().map(emp -> emp.getAge())
					  .reduce(0, (a, b) -> a + b);

		sum = emps.stream().map(emp -> emp.getAge())
				  .mapToInt(Integer::intValue)
				  .sum();
		
		sum = emps.stream().map(emp -> emp.getAge())
				  .collect(Collectors.summingInt(Integer::intValue));
		
		System.out.println("custom objects sum : "+sum);
	}

}

class ArithmeticUtils {

	public static int add(int number1, int number2) {
		return number1 + number2;
	}
}


		

Output

Sum of integers : 55
Sum of integers using summingInt : 55
IntStream sum : 55
Map values sum : 1000
custom objects sum : 105

8. Conclusion

In this post, we've seen what are the different ways to do sum of numbers using java stream api with examples.

GitHub

Stream.reduce()

Collectors api

No comments:

Post a Comment

Please do not add any spam links in the comments section.