Dinheiro em Java: Joda-Money, Money API e alm Otvio Santana - - PowerPoint PPT Presentation

dinheiro em java joda money money api e al m
SMART_READER_LITE
LIVE PREVIEW

Dinheiro em Java: Joda-Money, Money API e alm Otvio Santana - - PowerPoint PPT Presentation

Dinheiro em Java: Joda-Money, Money API e alm Otvio Santana @otaviojava otaviojava@java.net otaviojava@apache.org BigDecimal Double Integer Float Long Double e Float double val = 1.03 - .42; System.out.println(val); //0.610000000000


slide-1
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 2
slide-3
SLIDE 3
slide-4
SLIDE 4

Double Float

BigDecimal Integer Long

slide-5
SLIDE 5

Double e Float

double val = 1.03 - .42; System.out.println(val); //0.610000000000 0001

slide-6
SLIDE 6

Integer e Long

Economia de memória Velocidade Chance de dar problemas é alta Não passar de 8 casas decimais

slide-7
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
SLIDE 8

BigDecimal

  • Maior Controle
  • Mais intuitivo
slide-9
SLIDE 9

BigDecimal bd1 = new BigDecimal(.01); //0.01000000000000000020816681... BigDecimal bd2 = new BigDecimal(.3); //0.29999999999999998889776975... BigDecimal total = bd1.add(bd2)); //30999999999999998910593...

slide-10
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
SLIDE 11

Mais desafios para o Dinheiro

  • Internacionalização
  • Sair na tela
slide-12
SLIDE 12

public class Produto { private String nome; private String moeda; private BigDecimal dinheiro; //getter and setter }

slide-13
SLIDE 13

public class Produto { private String nome; private Moeda moeda; private BigDecimal dinheiro; //getter and setter } enum Moeda { REAL, DOLLAR, EURO; }

slide-14
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
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
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
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 18
slide-19
SLIDE 19

public interface Relatorio { void printHeader(); void printBody(); void printFooter(); } Relatorio relatorio = //; relatorio.printHeader(); relatorio.printBody(); relatorio.printFooter();

slide-20
SLIDE 20
slide-21
SLIDE 21

public interface Relatorio { void print(); } Relatorio relatorio = //; relatorio.print();

slide-22
SLIDE 22
slide-23
SLIDE 23
slide-24
SLIDE 24

public class Produto { private String nome; private Money money; //getter and setter } public class Money extends BigDecimal { private Currency money; }

slide-25
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
SLIDE 26

public class Mar { public Sal getSal(){ //...} public boolean temPeixe() { return true; } //... } public class Biscoito extends Mar { }

slide-27
SLIDE 27

public class ClassPai { public void bug(){ //... } //... } public class ClasseFilho extends ClassePai { }

slide-28
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 29
slide-30
SLIDE 30

Joda-Time JSR 310 Joda-Money JSR 354

slide-31
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
SLIDE 32

BigMoney bigMoney = money.toBigMoney(); bigMoney.isGreaterThan(b2); bigMoney.isLessThan(b2); bigMoney.isNegativeOrZero(); bigMoney.isPositiveOrZero(); bigMoney.plus(b2);

Joda-Money

slide-33
SLIDE 33

Money-API

slide-34
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
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
SLIDE 36

m1.isLessThan(m2); m1.isLessThanOrEqualTo(m2); m1.isGreaterThanOrEqualTo(m2); m1.isNegative(); m1.isPositive(); m1.isZero();

slide-37
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
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
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
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
SLIDE 41

MonetaryFunctions.isCurrency(DOLLAR).and( MonetaryFunctions.isBetween(min, max))); MonetaryFunctions.containsCurrencies(EURO, DOLLAR)).or(MonetaryFunctions.isGreaterTha n(money)));

slide-42
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
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
SLIDE 44

MonetarySummaryStatistics summary = moneys.stream().collect(MonetaryFunctions.s ummarizingMonetary(DOLLAR)); GroupMonetarySummaryStatistics groupSummary = moneys.stream().collect(MonetaryFunctions.g roupBySummarizingMonetary());

slide-45
SLIDE 45

MonetarySummaryStatistics summary = ... MonetaryAmount min = summary.getMin(); MonetaryAmount max = summary.getMax(); MonetaryAmount avarage = summary.getAverage(); Long count = summary.getCount();

slide-46
SLIDE 46

MoneyApi

GroupMonetarySummaryStatistics groupSummary =... Map<CurrencyUnit, MonetarySummaryStatistics> map = groupSummary.get(); MonetarySummaryStatistics summaryDollar = map.get(DOLLAR);

slide-47
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
SLIDE 48

ExchangeRateProvider prov = MonetaryConversions .getExchangeRateProvider("ECB"); MonetaryAmount d2e = prov.getCurrencyConversion(euro).apply(mDollar);

slide-49
SLIDE 49

ExchangeRateProvider prov = MonetaryConversions.getExchangeRateProvider ("IMF"); MonetaryAmount d2e = prov.getCurrencyConversion(euro).apply(mDollar );

slide-50
SLIDE 50

ExchangeRateProvider provider = MonetaryConversions .getExchangeRateProvider(ExchangeRateType. ECB); ExchangeRateType.ECB ExchangeRateType.IMF ExchangeRateType.ECB_HIST90 ExchangeRateType.ECB_HIST ExchangeRateType.IDENTITY

slide-51
SLIDE 51

ExchangeRateProvider provider = MonetaryConversions .getExchangeRateProvider(ExchangeRateType. ECB); moneys.stream().sorted(MonetaryFunctions.sort Valuable(provider)); moneys.stream().sorted(MonetaryFunctions.sort ValuableDesc(provider));

slide-52
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
SLIDE 53

MonetarySummaryStatistics summary = moneys.stream().collect( MonetaryFunctions.summarizingMonetary(real, provider)); summary.getCount(); summary.getMax(); summary.getMin(); summary.getAverage();

slide-54
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 55
slide-56
SLIDE 56
slide-57
SLIDE 57
slide-58
SLIDE 58

jobs@elo7.com

slide-59
SLIDE 59

Obrigado

Otávio Santana @otaviojava

  • taviojava@java.net
  • taviojava@apache.org