Saltar al contenido

Sumar BigDecimals usando Streams

Mantén la atención porque en esta reseña hallarás la solución que buscas.

Solución:

respuesta original

Sí, esto es posible:

List bdList = new ArrayList<>();
//populate list
BigDecimal result = bdList.stream()
        .reduce(BigDecimal.ZERO, BigDecimal::add);

Lo que hace es:

  1. Obtener un List.
  2. Conviértelo en un Stream
  3. Llame al método de reducción.

    3.1. Suministramos un valor de identidad para la suma, a saber BigDecimal.ZERO.

    3.2. Especificamos el BinaryOperatorque suma dos BigDecimal‘s, a través de una referencia de método BigDecimal::add.

Respuesta actualizada, después de editar

Veo que ha agregado nuevos datos, por lo tanto, la nueva respuesta será:

List invoiceList = new ArrayList<>();
//populate
Function totalMapper = invoice -> invoice.getUnit_price().multiply(invoice.getQuantity());
BigDecimal result = invoiceList.stream()
        .map(totalMapper)
        .reduce(BigDecimal.ZERO, BigDecimal::add);

Es casi lo mismo, excepto que he agregado un totalMapper variable, que tiene una función de Invoice a BigDecimal y devuelve el precio total de esa factura.

Entonces obtengo un Streamasignarlo a un Stream y luego reducirlo a un BigDecimal.

Ahora, desde un punto de diseño de programación orientada a objetos, le aconsejaría que también use el total() método, que ya ha definido, entonces incluso se vuelve más fácil:

List invoiceList = new ArrayList<>();
//populate
BigDecimal result = invoiceList.stream()
        .map(Invoice::total)
        .reduce(BigDecimal.ZERO, BigDecimal::add);

Aquí usamos directamente la referencia del método en el map método.

Esta publicación ya tiene una respuesta marcada, pero la respuesta no se filtra por null valores. La respuesta correcta debe evitar null valores utilizando la función Object::nonNull como predicado.

BigDecimal result = invoiceList.stream()
    .map(Invoice::total)
    .filter(Objects::nonNull)
    .filter(i -> (i.getUnit_price() != null) && (i.getQuantity != null))
    .reduce(BigDecimal.ZERO, BigDecimal::add);

Esto previene null valores de intentar ser sumados a medida que reducimos.

Puede resumir los valores de un BigDecimal corriente usando un reutilizable Coleccionista nombrado summingUp:

BigDecimal sum = bigDecimalStream.collect(summingUp());

los Collector se puede implementar así:

public static Collector summingUp() 
    return Collectors.reducing(BigDecimal.ZERO, BigDecimal::add);

Si sostienes algún reparo y disposición de enriquecer nuestro noticia te recomendamos realizar un exégesis y con placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *