foldLeft in Java

In Java, you can use the Collector interface to perform reduction operations on a collection, which is similar to the foldLeft function in Scala.

static <T,R> Collector<T,R,R> of(Supplier<R> supplier,
                                 BiConsumer<R,T> accumulator,
                                 BinaryOperator<R> combiner,
                                 Collector.Characteristics... characteristics)

Example

Given an example that one customer has multiple bank accounts:

public class BankAccount {
    String customerName;
    double balance;

    // getter, setters..
}

We want to group a list of bank accounts by customer name and find out the balance across the customers' bank accoutns.

List<BankAccount> bankAccounts; //...

Map<String, Double> customers = bankAccounts.stream()
    .collect(Collector.of(
        (Supplier<HashMap<String, Double>>) HashMap::new,
        (result, bankAccount) -> {
            var sum = result.getOrDefault(bankAccount.getCustomerName(), 0.0);
            result.put(b.getCustomerName(), sum + bankAccount.getBalance());
        },
        (a, b) -> a
    ));

This can also be addressed by using Java built-in groupingBy collector:

bankAccounts.stream()
    .collect(Collectors.groupingBy(BankAccount::getCustomerName,
        Collectors.summingDouble(BankAccount::getBalance)));