SLIDE 1 Dinheiro em Java: Joda-Money, Money API e além
Otávio Santana @otaviojava
- taviojava@java.net
- taviojava@apache.org
SLIDE 2
SLIDE 3
SLIDE 4
Double Float
BigDecimal Integer Long
SLIDE 5
Double e Float
double val = 1.03 - .42; System.out.println(val); //0.610000000000 0001
SLIDE 6
Integer e Long
Economia de memória Velocidade Chance de dar problemas é alta Não passar de 8 casas decimais
SLIDE 7
public class Produto { private String nome; private int dinheiro; //getter and setter } Produto banana = new Produto("banana", 1_00); Produto macarrao = new Produto("macarrao", 1_00); int total = banana.getDinheiro() + macarrao.getDinheiro();
SLIDE 8 BigDecimal
- Maior Controle
- Mais intuitivo
SLIDE 9
BigDecimal bd1 = new BigDecimal(.01); //0.01000000000000000020816681... BigDecimal bd2 = new BigDecimal(.3); //0.29999999999999998889776975... BigDecimal total = bd1.add(bd2)); //30999999999999998910593...
SLIDE 10
public class Produto { private String nome; private BigDecimal dinheiro; //getter and setter } Produto caneta = new Produto("caneta", BigDecimal.valueOf(10.21)); Produto lapis = new Produto("lapis", BigDecimal.valueOf(12.21)); BigDecimal total = caneta.getDinheiro().add(lapis.getDinheiro());
SLIDE 11 Mais desafios para o Dinheiro
- Internacionalização
- Sair na tela
SLIDE 12
public class Produto { private String nome; private String moeda; private BigDecimal dinheiro; //getter and setter }
SLIDE 13
public class Produto { private String nome; private Moeda moeda; private BigDecimal dinheiro; //getter and setter } enum Moeda { REAL, DOLLAR, EURO; }
SLIDE 14
public class Produto { private String nome; private Currency moeda; private BigDecimal dinheiro; //getter and setter } Currency dollar = Currency.getInstance(Locale.US); Currency real = Currency.getInstance("BRL");
SLIDE 15
Produto celular = //instância; Produto notebook = //instância; BigDecimal valor = celular.getValor().add(notebook.getValor());
Produto celular = //instância; Produto notebook = //instância; if(celular.getMoeda().equals(notebook.getMoeda())) { BigDecimal valor = celular.getValor().add(notebook.getValor()); } //exception
SLIDE 16
public class ProdutoUtils { public static BigDecimal somar(Produto pA, Produto pB) { if(pA.getMoeda().equals(pB.getMoeda())) { return pA.getValor().add(pB.getValor()); } return null; } } BigDecimal valor = ProdutoUtils.somar(celular, notebook);
SLIDE 17
public class MoneyUtils { public static BigDecimal somar(Currency moedaA, BigDecimal valorA, Currency moedaB, BigDecimal valorB) { //... } public class AssinaturaUtils {} public class ServicoUtils {} ...
SLIDE 18
SLIDE 19
public interface Relatorio { void printHeader(); void printBody(); void printFooter(); } Relatorio relatorio = //; relatorio.printHeader(); relatorio.printBody(); relatorio.printFooter();
SLIDE 20
SLIDE 21
public interface Relatorio { void print(); } Relatorio relatorio = //; relatorio.print();
SLIDE 22
SLIDE 23
SLIDE 24
public class Produto { private String nome; private Money money; //getter and setter } public class Money extends BigDecimal { private Currency money; }
SLIDE 25
Money valorBanana = new Money("12.00", dollar); Money valorAbacaxi = new Money("12.00", dollar); Produto banana = new Produto("banana", valorBanana); Produto abacaxi = new Produto("abacaxi", valorAbacaxi); Money money = banana.getMoney().add(valorBanana);
SLIDE 26
public class Mar { public Sal getSal(){ //...} public boolean temPeixe() { return true; } //... } public class Biscoito extends Mar { }
SLIDE 27
public class ClassPai { public void bug(){ //... } //... } public class ClasseFilho extends ClassePai { }
SLIDE 28
public class Money { private Currency currency; private BigDecimal value; } Produto banana = new Produto("banana", valorBanana); Produto abacaxi = new Produto("abacaxi", valorAbacaxi); Money money = banana.getMoney().add(abacaxi.getMoney());
SLIDE 29
SLIDE 30
Joda-Time JSR 310 Joda-Money JSR 354
SLIDE 31
CurrencyUnit usd = CurrencyUnit.of("USD"); Money m = Money.of(usd, 12.43d); Money money = Money.parse("USD 23.87"); Money result = money.plus(m);
Joda-Money
SLIDE 32
BigMoney bigMoney = money.toBigMoney(); bigMoney.isGreaterThan(b2); bigMoney.isLessThan(b2); bigMoney.isNegativeOrZero(); bigMoney.isPositiveOrZero(); bigMoney.plus(b2);
Joda-Money
SLIDE 33
Money-API
SLIDE 34
CurrencyUnit currency = MonetaryCurrencies.getCurrency(Locale.US); MonetaryAmount money = Money.of(BigDecimal.valueOf(10), currency); MonetaryAmount fastMoney = FastMoney.of(BigDecimal.valueOf(10), currency);
SLIDE 35
CurrencyUnit real = MonetaryCurrencies.getCurrency("BRL"); MonetaryAmount m1 = Money.of(BigDecimal.valueOf(12D), real); MonetaryAmount m2 = Money.of(BigDecimal.valueOf(10D), real); MonetaryAmount m3 = m1.add(m2); MonetaryAmount m4 = m1.subtract(m2); MonetaryAmount m5 = m1.divide(2L);
SLIDE 36
m1.isLessThan(m2); m1.isLessThanOrEqualTo(m2); m1.isGreaterThanOrEqualTo(m2); m1.isNegative(); m1.isPositive(); m1.isZero();
SLIDE 37
CurrencyUnit dollar = MonetaryCurrencies.getCurrency(Locale.US); MonetaryAmount m = Money.of(120, dollar); NumberValue number = m.getNumber(); BigDecimal value = number.numberValue(BigDecimal.class);
SLIDE 38
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(Locale.US); String texto = format.format(m);//12,50 USD MonetaryAmount money = Money.parse("EUR 25.25"); MonetaryAmount m2 = Money.parse(texto, format);
SLIDE 39
MonetaryAmount noMoney = Money.of(0, euro); MonetaryAmount m1 = Money.of(10, euro); MonetaryAmount m2 = Money.of(30, euro); MonetaryAmount m3 = Money.of(40, euro); List<MonetaryAmount> moneys = Arrays.asList(m1, m2, m3); MonetaryAmount sum = moneys.stream().reduce(MonetaryFunctions.sum()).orEl se(noMoney);
SLIDE 40
List<MonetaryAmount> justDollar = moneys.stream() .filter((MonetaryFunctions.isCurrency(DOLLAR))) .collect(Collectors.toList()); List<MonetaryAmount> notEuro = moneys.stream().filter((MonetaryFunctions.isNotCu rrency(EURO))).collect(Collectors.toList());
SLIDE 41
MonetaryFunctions.isCurrency(DOLLAR).and( MonetaryFunctions.isBetween(min, max))); MonetaryFunctions.containsCurrencies(EURO, DOLLAR)).or(MonetaryFunctions.isGreaterTha n(money)));
SLIDE 42 List<MonetaryAmount> orderCurrencyValue = moneys.stream().sorted(MonetaryFunctions.s
- rtCurrencyUnit().thenComparing(Monetary
Functions.sortNumber())).collect(Collectors.to List()); List<MonetaryAmount> orderHighValue = moneys.stream().sorted(MonetaryFunctions.s
- rtCurrencyUnit().thenComparing(
MonetaryFunctions.sortCurrencyUnitDesc())) .collect(Collectors.toList());
SLIDE 43
Map<CurrencyUnit, List<MonetaryAmount>> groupBy = moneys.stream().collect(MonetaryFunctions.g roupByCurrencyUnit()); List<MonetaryAmount> notEuro = moneys.stream().filter((MonetaryFunctions.is NotCurrency(EURO))).collect(Collectors.toLis t());
SLIDE 44
MonetarySummaryStatistics summary = moneys.stream().collect(MonetaryFunctions.s ummarizingMonetary(DOLLAR)); GroupMonetarySummaryStatistics groupSummary = moneys.stream().collect(MonetaryFunctions.g roupBySummarizingMonetary());
SLIDE 45
MonetarySummaryStatistics summary = ... MonetaryAmount min = summary.getMin(); MonetaryAmount max = summary.getMax(); MonetaryAmount avarage = summary.getAverage(); Long count = summary.getCount();
SLIDE 46
MoneyApi
GroupMonetarySummaryStatistics groupSummary =... Map<CurrencyUnit, MonetarySummaryStatistics> map = groupSummary.get(); MonetarySummaryStatistics summaryDollar = map.get(DOLLAR);
SLIDE 47
CurrencyUnit real = MonetaryCurrencies.getCurrency("BRL"); CurrencyUnit dollar = MonetaryCurrencies.getCurrency(Locale.US); MonetaryAmount m1 = Money.of(BigDecimal.valueOf(12D), real); MonetaryAmount m2 = Money.of(BigDecimal.valueOf(10D), dollar); m1.add(m2); javax.money.MonetaryException: Currency mismatch: BRL/USD
SLIDE 48
ExchangeRateProvider prov = MonetaryConversions .getExchangeRateProvider("ECB"); MonetaryAmount d2e = prov.getCurrencyConversion(euro).apply(mDollar);
SLIDE 49
ExchangeRateProvider prov = MonetaryConversions.getExchangeRateProvider ("IMF"); MonetaryAmount d2e = prov.getCurrencyConversion(euro).apply(mDollar );
SLIDE 50
ExchangeRateProvider provider = MonetaryConversions .getExchangeRateProvider(ExchangeRateType. ECB); ExchangeRateType.ECB ExchangeRateType.IMF ExchangeRateType.ECB_HIST90 ExchangeRateType.ECB_HIST ExchangeRateType.IDENTITY
SLIDE 51
ExchangeRateProvider provider = MonetaryConversions .getExchangeRateProvider(ExchangeRateType. ECB); moneys.stream().sorted(MonetaryFunctions.sort Valuable(provider)); moneys.stream().sorted(MonetaryFunctions.sort ValuableDesc(provider));
SLIDE 52 List<MonetaryAmount> orderCurrencyValue = moneys.stream().sorted(MonetaryFunctions.sortV aluable(provider).collect(Collectors.toList());
- 9 BRL
- 8 USD
- 7 EUR
- Motivo:
- 1 USD = 2.4203 BRL
- 1 EUR = 4.4203 BRL
- 1 USD = 0.79 EUR
- 7 EUR
- 9 BRL
- 8 USD
SLIDE 53
MonetarySummaryStatistics summary = moneys.stream().collect( MonetaryFunctions.summarizingMonetary(real, provider)); summary.getCount(); summary.getMax(); summary.getMin(); summary.getAverage();
SLIDE 54
moneys.stream().reduce(MonetaryFunctions.su m(provider, dollar)); moneys.stream().reduce(MonetaryFunctions.min (provider)); moneys.stream().reduce(MonetaryFunctions.ma x(provider));
SLIDE 55
SLIDE 56
SLIDE 57
SLIDE 58
jobs@elo7.com
SLIDE 59 Obrigado
Otávio Santana @otaviojava
- taviojava@java.net
- taviojava@apache.org