Sumar números con secuencias de Java

1. Introducción

En este tutorial rápido, mostraremos varias formas de calcular la suma de números enteros, usando la API Stream .

En aras de la simplicidad, usaremos números enteros en nuestros ejemplos. Sin embargo, también podemos aplicar los mismos métodos a largos y dobles.

2. Usando Stream.reduce ()

Stream.reduce () es una operación de terminal que realiza una reducción en los elementos de la secuencia .

Aplica un operador binario (acumulador) a cada elemento del flujo, donde el primer operando es el valor de retorno de la aplicación anterior y el segundo es el elemento del flujo actual.

En el primer método de usar el método reduce () , la función acumuladora es una expresión lambda que agrega dos valores enteros y devuelve un valor entero :

List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, (a, b) -> a + b);

De la misma forma, podemos utilizar un método Java ya existente :

List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, Integer::sum);

O podemos definir y usar nuestro método personalizado:

public class ArithmeticUtils { public static int add(int a, int b) { return a + b; } } 

Luego, podemos pasar esta función como parámetro al método reduce () :

List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .reduce(0, ArithmeticUtils::add); 

3. Usando Stream.collect ()

El segundo método para calcular la suma de una lista de números enteros es mediante la operación de terminal collect () :

List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .collect(Collectors.summingInt(Integer::intValue));

De manera similar, la clase Collectors proporciona los métodos summingLong () y summingDouble () para calcular las sumas de longs y dobles respectivamente.

4. Usando IntStream.sum ()

La API Stream nos proporciona la operación intermedia mapToInt () , que convierte nuestra secuencia en un objeto IntStream .

Este método toma un mapeador como parámetro, que usa para hacer la conversión, luego, podemos llamar al método sum () para calcular la suma de los elementos del flujo.

Veamos un ejemplo rápido de cómo podemos usarlo:

List integers = Arrays.asList(1, 2, 3, 4, 5); Integer sum = integers.stream() .mapToInt(Integer::intValue) .sum();

De la misma manera, podemos usar los métodos mapToLong () y mapToDouble () para calcular las sumas de longs y dobles respectivamente.

5. Uso de Stream # sum con Map

Para calcular la suma de valores de una estructura de datos de Mapa , primero creamos una secuencia a partir de los valores de ese Mapa , luego aplicamos uno de los métodos que usamos anteriormente.

Por ejemplo, usando IntStream.sum () :

Integer sum = map.values() .stream() .mapToInt(Integer::valueOf) .sum();

6. Uso de Stream # sum con objetos

Imaginemos que tenemos una lista de objetos y que queremos calcular la suma de todos los valores de un campo dado de estos objetos.

Por ejemplo:

public class Item { private int id; private Integer price; public Item(int id, Integer price) { this.id = id; this.price = price; } // Standard getters and setters } 

A continuación, imaginemos que queremos calcular el precio total de todos los artículos de la siguiente lista:

Item item1 = new Item(1, 10); Item item2 = new Item(2, 15); Item item3 = new Item(3, 25); Item item4 = new Item(4, 40); List items = Arrays.asList(item1, item2, item3, item4);

En este caso, para calcular la suma usando los métodos mostrados en los ejemplos anteriores, necesitamos llamar al método map () para convertir nuestra secuencia en una secuencia de números enteros .

Como resultado, podemos usar Stream.reduce (), Stream.collect () e IntStream.sum () para calcular la suma:

Integer sum = items.stream() .map(x -> x.getPrice()) .reduce(0, ArithmeticUtils::add); 
Integer sum = items.stream() .map(x -> x.getPrice()) .reduce(0, Integer::sum);
Integer sum = items.stream() .map(item -> item.getPrice()) .reduce(0, (a, b) -> a + b);
Integer sum = items.stream() .map(x -> x.getPrice()) .collect(Collectors.summingInt(Integer::intValue));
items.stream() .mapToInt(x -> x.getPrice()) .sum();

7. Uso de Stream # sum con String

Supongamos que tenemos un objeto String que contiene algunos enteros.

Para calcular la suma de estos números enteros, en primer lugar, debemos convertir esa Cadena en una matriz , luego debemos filtrar los elementos que no son enteros y, finalmente, convertir los elementos restantes de esa matriz en números.

Veamos todos estos pasos en acción:

String string = "Item1 10 Item2 25 Item3 30 Item4 45"; Integer sum = Arrays.stream(string.split(" ")) .filter((s) -> s.matches("\\d+")) .mapToInt(Integer::valueOf) .sum();

8. Conclusión

En este tutorial, vimos varios métodos de cómo calcular la suma de una lista de números enteros usando la API Stream. Además, usamos estos métodos para calcular la suma de valores de un campo dado de una lista de objetos, la suma de los valores de un mapa, así como los números dentro de un objeto String dado .

Como siempre, el código completo está disponible en GitHub.