Решение с использованием потоковой передачи
Чтобы найти минимальную дату, вы можете сделать что-то вроде этого:
Optional<Date> minDate = list.stream().map(v -> v.logDate).min(Date::compareTo);
И рассчитать сумму:
double sum = list.stream().mapToDouble(v -> v.prize).sum();
Я бы не стал беспокоиться об «оптимизации» этого и попытках сделать это за один цикл, если только это не является серьезным узким местом в вашей системе (маловероятно).Разделение двух идей упрощает понимание и сопровождение кода.
Использование вами BigDecimal
Ваш код для выполнения balance.add(...)
для BigDecimal
на самом деле не будет работать так, как выВы написали это потому, что метод add
в BigDecimal
возвращает новый экземпляр, а не изменяет существующий.BigDecimal
экземпляры являются неизменными.Вы не можете присвоить новое значение balance
, потому что оно эффективно final
из контекста лямбды.
Хотя идея использования BigDecimal
хороша.Вам следует избегать использования double
для всего, где важны точные десятичные знаки (например, деньги).Если вы измените prize
на BigDecimal, вы не сможете использовать sum()
, но вы можете использовать reduce()
для выполнения той же функции.
BigDecimal sum = list.stream().map(v -> v.prize).reduce(BigDecimal.ZERO, BigDecimal::add);