Посчитать сумму значений по разным полям
Есть List объектов PaymentEntity.
public class PaymentEntity {
private BigDecimal number;
private BigDecimal fullDebtRemnant;
private BigDecimal percentAmount;
}
Необходимо посчитать сумму number, fullDebtRemnant, percentAmount. Каждую сумму считаю отдельно.
BigDecimal sumFullDebt = paymentEntityList
.stream()
.map(PaymentEntity::getFullDebtRemnant)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal sumPercentAmount = paymentEntityList
.stream()
.map(PaymentEntity::getPercentAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
Как можно посчитать сумму каждого параметра в одно стриме?
Ответы (1 шт):
Автор решения: Alex Rudenko
→ Ссылка
- При необходимости реализовать конструктор(ы) в
PaymentEntityдля инициализации нулями:
class PaymentEntity {
// ...
public PaymentEntity() {
this(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO);
}
public PaymentEntity(BigDecimal n, BigDecimal f, BigDecimal p) {
number = n;
fullDebtRemnant = f;
percentAmount = p;
}
}
- Определить метод для суммирования всех полей в
PaymentEntity:
- как статический:
public class Accumulator {
public static PaymentEntity add(PaymentEntity acc, PaymentEntity add) {
acc.setNumber(acc.getNumber().add(add.getNumber()));
acc.setFullDebtRemnant(acc.getFullDebtRemnant().add(add.getFullDebtRemnant()));
acc.setPercentAmount(acc.getPercentAmount().add(add.getPercentAmount()));
return acc;
}
}
Тогда список можно просуммировать так:
PaymentEntity total = list.stream()
.reduce(new PaymentEntity(), Accumulator::add);
- метод класса
PaymentEntityаналогичным образом:
// class PaymentEntity
PaymentEntity accumulate(PaymentEntity that) {
this.setNumber(this.getNumber().add(that.getNumber()));
this.setFullDebtRemnant(this.getFullDebtRemnant().add(that.getFullDebtRemnant()));
this.setPercentAmount(this.getPercentAmount().add(that.getPercentAmount()));
return this;
}
Сумма рассчитывается так:
PaymentEntity total = list.stream()
.reduce(new PaymentEntity(), PaymentEntity::accumulate);
Тест:
List<PaymentEntity> list = Arrays.asList(
new PaymentEntity(new BigDecimal("120"), new BigDecimal("1250"), new BigDecimal("10.5")),
new PaymentEntity(new BigDecimal("150"), new BigDecimal("1000"), new BigDecimal("8.5")),
new PaymentEntity(new BigDecimal("100"), new BigDecimal("750"), new BigDecimal("6.0"))
);
PaymentEntity total = list.stream()
.reduce(new PaymentEntity(), PaymentEntity::accumulate);
System.out.println(total);
Вывод:
number: 370; debtRemnant: 3000; percentAmount: 25.0