Sum
Sum is a reduction method. Given a stream of MonetaryAmount
, it returns the sum of its elements. Here's an example.
public class ReduceSumMonetaryAmount {
public static void main(String[] args) {
CurrencyUnit dollar = Monetary.getCurrency("USD");
MonetaryAmount money = Money.of(10, dollar);
MonetaryAmount money2 = Money.of(10, dollar);
MonetaryAmount money3 = Money.of(10, dollar);
MonetaryAmount money4 = Money.of(9, dollar);
MonetaryAmount money5 = Money.of(8, dollar);
Optional<MonetaryAmount> result = Stream.of(money, money2, money3, money4, money5).reduce(MonetaryFunctions.sum());
result.ifPresent(System.out::println);//USD 47
}
}
Notice that the operation will throw an exception if applied on a stream of money with different currencies as shown below.
public class ReduceSumMonetaryAmountError {
public static void main(String[] args) {
CurrencyUnit dollar = Monetary.getCurrency("USD");
CurrencyUnit real = Monetary.getCurrency("BRL");
MonetaryAmount money = Money.of(10, dollar);
MonetaryAmount money2 = Money.of(10, dollar);
MonetaryAmount money3 = Money.of(10, real);
MonetaryAmount money4 = Money.of(9, dollar);
MonetaryAmount money5 = Money.of(8, dollar);
Optional<MonetaryAmount> result = Stream.of(money, money2, money3, money4, money5).reduce(
MonetaryFunctions.sum());//javax.money.MonetaryException: Currency mismatch: BRL/USD
}
}
In Moneta, you can provide an implementation of ExchangeRateProvider
in order to perform currency conversions for monetary values with different currencies as shown below.
public class ReduceSumMonetaryAmountExchange {
public static void main(String[] args) {
CurrencyUnit dollar = Monetary.getCurrency("USD");
CurrencyUnit real = Monetary.getCurrency("BRL");
ExchangeRateProvider provider = MonetaryConversions.getExchangeRateProvider(ExchangeRateType.IMF);
MonetaryAmount money = Money.of(10, dollar);
MonetaryAmount money2 = Money.of(10, dollar);
MonetaryAmount money3 = Money.of(10, real);
MonetaryAmount money4 = Money.of(9, dollar);
MonetaryAmount money5 = Money.of(8, dollar);
Optional<MonetaryAmount> result = Stream.of(money, money2, money3, money4, money5).reduce(
MonetaryFunctions.sum(provider, dollar));//javax.money.MonetaryException: Currency mismatch: BRL/USD
result.ifPresent(System.out::println);//money converted in dollar
}
}