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:
- Obtener un
List
. - Conviértelo en un
Stream
-
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
BinaryOperator
que suma dosBigDecimal
‘s, a través de una referencia de métodoBigDecimal::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 Stream
asignarlo 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.