dinheiro em java: joda-money, money api e além

58
Dinheiro em Java: Joda-Money, Money API e além Otávio Santana @otaviojava [email protected] [email protected]

Upload: otavio-goncalves-de-santana

Post on 15-Jul-2015

612 views

Category:

Technology


8 download

TRANSCRIPT

Page 1: Dinheiro em Java: Joda-Money, Money API e além

Dinheiro em Java: Joda-Money, Money API e além

Otávio Santana@[email protected]@apache.org

Page 2: Dinheiro em Java: Joda-Money, Money API e além
Page 3: Dinheiro em Java: Joda-Money, Money API e além
Page 4: Dinheiro em Java: Joda-Money, Money API e além

Double Float

BigDecimalIntegerLong

Page 5: Dinheiro em Java: Joda-Money, Money API e além

Double e Float

double val = 1.03 - .42;

System.out.println(val); //0.6100000000000001

Page 6: Dinheiro em Java: Joda-Money, Money API e além

Integer e Long

Economia de memória

Velocidade

Chance de dar problemas é alta

Não passar de 8 casas decimais

Page 7: Dinheiro em Java: Joda-Money, Money API e além

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();

Page 8: Dinheiro em Java: Joda-Money, Money API e além

BigDecimal

● Maior Controle● Mais intuitivo

Page 9: Dinheiro em Java: Joda-Money, Money API e além

BigDecimal bd1 = new BigDecimal(.01);

//0.01000000000000000020816681...

BigDecimal bd2 = new BigDecimal(.3);

//0.29999999999999998889776975...

BigDecimal total = bd1.add(bd2));

//30999999999999998910593...

Page 10: Dinheiro em Java: Joda-Money, Money API e além

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());

Page 11: Dinheiro em Java: Joda-Money, Money API e além

Mais desafios para o Dinheiro

● Internacionalização● Sair na tela

Page 12: Dinheiro em Java: Joda-Money, Money API e além

public class Produto {

private String nome;

private String moeda;

private BigDecimal dinheiro;

//getter and setter

}

Page 13: Dinheiro em Java: Joda-Money, Money API e além

public class Produto {

private String nome;

private Moeda moeda;

private BigDecimal dinheiro;

//getter and setter

}

enum Moeda {

REAL, DOLLAR, EURO;

}

Page 14: Dinheiro em Java: Joda-Money, Money API e além

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");

Page 15: Dinheiro em Java: Joda-Money, Money API e além

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

Page 16: Dinheiro em Java: Joda-Money, Money API e além

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);

Page 17: Dinheiro em Java: Joda-Money, Money API e além

public class MoneyUtils {

public static BigDecimal somar(Currency moedaA, BigDecimal valorA, Currency moedaB, BigDecimal valorB) {

//...

}

public class AssinaturaUtils {}

public class ServicoUtils {}

...

Page 18: Dinheiro em Java: Joda-Money, Money API e além
Page 19: Dinheiro em Java: Joda-Money, Money API e além

public interface Relatorio {

void printHeader();

void printBody();

void printFooter();

}

Relatorio relatorio = //;

relatorio.printHeader();

relatorio.printBody();

relatorio.printFooter();

Page 20: Dinheiro em Java: Joda-Money, Money API e além
Page 21: Dinheiro em Java: Joda-Money, Money API e além

public interface Relatorio {

void print();

}

Relatorio relatorio = //;

relatorio.print();

Page 22: Dinheiro em Java: Joda-Money, Money API e além
Page 23: Dinheiro em Java: Joda-Money, Money API e além
Page 24: Dinheiro em Java: Joda-Money, Money API e além

public class Produto {

private String nome;

private Money money;

//getter and setter

}

public class Money extends BigDecimal {

private Currency money;

}

Page 25: Dinheiro em Java: Joda-Money, Money API e além

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);

Page 26: Dinheiro em Java: Joda-Money, Money API e além

public class Mar {

public Sal getSal(){ //...}

public boolean temPeixe() {

return true;

}

//...

}

public class Biscoito extends Mar {

}

Page 27: Dinheiro em Java: Joda-Money, Money API e além

public class ClassPai {

public void bug(){

//...

}

//...

}

public class ClasseFilho extends ClassePai {

}

Page 28: Dinheiro em Java: Joda-Money, Money API e além

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());

Page 29: Dinheiro em Java: Joda-Money, Money API e além
Page 30: Dinheiro em Java: Joda-Money, Money API e além

Joda-TimeJSR 310Joda-MoneyJSR 354

Page 31: Dinheiro em Java: Joda-Money, Money API e além

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

Page 32: Dinheiro em Java: Joda-Money, Money API e além

BigMoney bigMoney = money.toBigMoney();

bigMoney.isGreaterThan(b2);

bigMoney.isLessThan(b2);

bigMoney.isNegativeOrZero();

bigMoney.isPositiveOrZero();

bigMoney.plus(b2);

Joda-Money

Page 33: Dinheiro em Java: Joda-Money, Money API e além

Money-API

Page 34: Dinheiro em Java: Joda-Money, Money API e além

CurrencyUnit currency = MonetaryCurrencies.getCurrency(Locale.US);

MonetaryAmount money = Money.of(BigDecimal.valueOf(10), currency);

MonetaryAmount fastMoney = FastMoney.of(BigDecimal.valueOf(10), currency);

Page 35: Dinheiro em Java: Joda-Money, Money API e além

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);

Page 36: Dinheiro em Java: Joda-Money, Money API e além

m1.isLessThan(m2);

m1.isLessThanOrEqualTo(m2);

m1.isGreaterThanOrEqualTo(m2);

m1.isNegative();

m1.isPositive();

m1.isZero();

Page 37: Dinheiro em Java: Joda-Money, Money API e além

CurrencyUnit dollar = MonetaryCurrencies.getCurrency(Locale.US);

MonetaryAmount m = Money.of(120, dollar);

NumberValue number = m.getNumber();

BigDecimal value = number.numberValue(BigDecimal.class);

Page 38: Dinheiro em Java: Joda-Money, Money API e além

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);

Page 39: Dinheiro em Java: Joda-Money, Money API e além

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()).orElse(noMoney);

Page 40: Dinheiro em Java: Joda-Money, Money API e além

List<MonetaryAmount> justDollar = moneys.stream().filter((MonetaryFunctions.isCurrency(DOLLAR)))

.collect(Collectors.toList());

List<MonetaryAmount> notEuro = moneys.stream().filter((MonetaryFunctions.isNotCurrency(EURO))).collect(Collectors.toList());

Page 41: Dinheiro em Java: Joda-Money, Money API e além

MonetaryFunctions.isCurrency(DOLLAR).and(MonetaryFunctions.isBetween(min, max)));

MonetaryFunctions.containsCurrencies(EURO, DOLLAR)).or(MonetaryFunctions.isGreaterThan(money)));

Page 42: Dinheiro em Java: Joda-Money, Money API e além

List<MonetaryAmount> orderCurrencyValue = moneys.stream().sorted(MonetaryFunctions.sortCurrencyUnit().thenComparing(MonetaryFunctions.sortNumber())).collect(Collectors.toList());

List<MonetaryAmount> orderHighValue = moneys.stream().sorted(MonetaryFunctions.sortCurrencyUnit().thenComparing(MonetaryFunctions.sortCurrencyUnitDesc()))

.collect(Collectors.toList());

Page 43: Dinheiro em Java: Joda-Money, Money API e além

Map<CurrencyUnit, List<MonetaryAmount>> groupBy = moneys.stream().collect(MonetaryFunctions.groupByCurrencyUnit());

List<MonetaryAmount> notEuro = moneys.stream().filter((MonetaryFunctions.isNotCurrency(EURO))).collect(Collectors.toList());

Page 44: Dinheiro em Java: Joda-Money, Money API e além

MonetarySummaryStatistics summary = moneys.stream().collect(MonetaryFunctions.summarizingMonetary(DOLLAR));

GroupMonetarySummaryStatistics groupSummary = moneys.stream().collect(MonetaryFunctions.groupBySummarizingMonetary());

Page 45: Dinheiro em Java: Joda-Money, Money API e além

MonetarySummaryStatistics summary = ...

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

Page 46: Dinheiro em Java: Joda-Money, Money API e além

MoneyApi

GroupMonetarySummaryStatistics groupSummary =...

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

Page 47: Dinheiro em Java: Joda-Money, Money API e além

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

Page 48: Dinheiro em Java: Joda-Money, Money API e além

ExchangeRateProvider prov = MonetaryConversions

.getExchangeRateProvider("ECB");

MonetaryAmount d2e = prov.getCurrencyConversion(euro).apply(mDollar);

Page 49: Dinheiro em Java: Joda-Money, Money API e além

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

Page 50: Dinheiro em Java: Joda-Money, Money API e além

ExchangeRateProvider provider = MonetaryConversions.getExchangeRateProvider(ExchangeRateType.ECB);

ExchangeRateType.ECBExchangeRateType.IMFExchangeRateType.ECB_HIST90ExchangeRateType.ECB_HISTExchangeRateType.IDENTITY

Page 51: Dinheiro em Java: Joda-Money, Money API e além

ExchangeRateProvider provider = MonetaryConversions.getExchangeRateProvider(ExchangeRateType.ECB);

moneys.stream().sorted(MonetaryFunctions.sortValuable(provider));

moneys.stream().sorted(MonetaryFunctions.sortValuableDesc(provider));

Page 52: Dinheiro em Java: Joda-Money, Money API e além

List<MonetaryAmount> orderCurrencyValue = moneys.stream().sorted(MonetaryFunctions.sortValuable(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

Page 53: Dinheiro em Java: Joda-Money, Money API e além

MonetarySummaryStatistics summary = moneys.stream().collect(MonetaryFunctions.summarizingMonetary(real, provider));

summary.getCount();summary.getMax();summary.getMin();summary.getAverage();

Page 54: Dinheiro em Java: Joda-Money, Money API e além

moneys.stream().reduce(MonetaryFunctions.sum(provider, dollar));

moneys.stream().reduce(MonetaryFunctions.min(provider));

moneys.stream().reduce(MonetaryFunctions.max(provider));

Page 55: Dinheiro em Java: Joda-Money, Money API e além
Page 56: Dinheiro em Java: Joda-Money, Money API e além
Page 57: Dinheiro em Java: Joda-Money, Money API e além
Page 58: Dinheiro em Java: Joda-Money, Money API e além

Obrigado

Otávio Santana@[email protected]@apache.org