Juntando as ordenações
Apenas como recordação, já que esse recurso não é da money-api e sim do Java 8, é possível também misturar mais de um ordenador, para isso basta utilizar o método thenComparing. Basicamente ele faz a ordenação e caso os valores tenham o mesmo peso, ao usar o compare retorne o valor zero, ele usará o outro ordenador, assim a ordem que for definida o sort influenciará no resultado da ordenação.
public class SortMixMonetaryAmountNumberCurrency {
public static void main(String[] args) {
CurrencyUnit dollar = Monetary.getCurrency("USD");
CurrencyUnit euro = Monetary.getCurrency("EUR");
CurrencyUnit real = Monetary.getCurrency("BRL");
MonetaryAmount money = Money.of(10, euro);
MonetaryAmount money2 = Money.of(10, dollar);
MonetaryAmount money3 = Money.of(10, real);
MonetaryAmount money4 = Money.of(9, real);
MonetaryAmount money5 = Money.of(8, dollar);
List<MonetaryAmount> resultAsc = Stream.of(money, money2, money3, money4, money5)
.sorted(MonetaryFunctions
.sortNumber().thenComparing(MonetaryFunctions.sortCurrencyUnit()))
.collect(Collectors.toList());//[USD 8, BRL 9, BRL 10, EUR 10, USD 10]
List<MonetaryAmount> resultDesc = Stream.of(money, money2, money3, money4, money5)
.sorted(MonetaryFunctions
.sortNumberDesc().thenComparing(MonetaryFunctions.sortCurrencyUnitDesc()))
.collect(Collectors.toList());//[USD 10, EUR 10, BRL 10, BRL 9, USD 8]
//using currency first
List<MonetaryAmount> resultCurrencyAsc = Stream.of(money, money2, money3, money4, money5)
.sorted(MonetaryFunctions
.sortCurrencyUnit().thenComparing(MonetaryFunctions.sortNumber()))
.collect(Collectors.toList());//[BRL 9, BRL 10, EUR 10, USD 8, USD 10]
List<MonetaryAmount> resultCurrencyDesc = Stream.of(money, money2, money3, money4, money5)
.sorted(MonetaryFunctions
.sortCurrencyUnitDesc().thenComparing(MonetaryFunctions.sortNumberDesc()))
.collect(Collectors.toList());//[USD 10, USD 8, EUR 10, BRL 10, BRL 9]
}
}