MonetaryFunctions还提供了归约函数,可以用来获取最大值,最小值,以及求和:
- List<MonetaryAmount> amounts = new ArrayList<>();
- amounts.add(Money.of(10, "EUR"));
- amounts.add(Money.of(7.5, "EUR"));
- amounts.add(Money.of(12, "EUR"));
-
- Optional<MonetaryAmount> max = amounts.stream().reduce(MonetaryFunctions.max());
- Optional<MonetaryAmount> min = amounts.stream().reduce(MonetaryFunctions.min());
- Optional<MonetaryAmount> sum = amounts.stream().reduce(MonetaryFunctions.sum());
自定义的MonetaryAmount操作 MonetaryAmount还提供了一个非常友好的扩展点叫作MonetaryOperator。MonetaryOperator是一个函数式接口,它接收一个MonetaryAmount入参并返回一个新的MonetaryAmount对象。 -
-
- MonetaryOperator tenPercentOperator = (MonetaryAmount amount) -> {
- BigDecimal baseAmount = amount.getNumber().numberValue(BigDecimal.class);
- BigDecimal tenPercent = baseAmount.multiply(new BigDecimal("0.1"));
- return Money.of(tenPercent, amount.getCurrency());
- };
-
- MonetaryAmount dollars = Money.of(12.34567, "USD");
-
-
- MonetaryAmount tenPercentDollars = dollars.with(tenPercentOperator);
标准的API特性都是通过MonetaryOperator的接口来实现的。比方说,前面看到的舍入操作就是以MonetaryOperator接口的形式来提供的。 汇率 货币兑换率可以通过ExchangeRateProvider来获取。JavaMoney自带了多个不同的ExchangeRateProvider的实现。其中最重要的两个是ECBCurrentRateProvider与 IMFRateProvider。 ECBCurrentRateProvider查询的是欧洲中央银行(European Central Bank,ECB)的数据而IMFRateProvider查询的是国际货币基金组织(International Monetary Fund,IMF)的汇率。 -
- ExchangeRateProvider exchangeRateProvider = MonetaryConversions.getExchangeRateProvider();
-
-
-
- List<String> defaultProviderChain = MonetaryConversions.getDefaultProviderChain();
-
-
- ExchangeRateProvider ecbExchangeRateProvider = MonetaryConversions.getExchangeRateProvider("ECB");
如果没有指定ExchangeRateProvider的话返回的就是CompoundRateProvider。CompoundRateProvider会将汇率转换请求委派给一个ExchangeRateProvider链并将第一个返回准确结果的提供商的数据返回。 -
- ExchangeRate rate = exchangeRateProvider.getExchangeRate("EUR", "USD");
-
- NumberValue factor = rate.getFactor();
- CurrencyUnit baseCurrency = rate.getBaseCurrency();
- CurrencyUnit targetCurrency = rate.getCurrency();
货币转换 不同货币间的转换可以通过ExchangeRateProvider返回的CurrencyConversions来完成。 -
- CurrencyConversion dollarConversion = MonetaryConversions.getConversion("USD");
-
-
- CurrencyConversion ecbDollarConversion = ecbExchangeRateProvider.getCurrencyConversion("USD");
-
- MonetaryAmount tenEuro = Money.of(10, "EUR");
-
-
- MonetaryAmount inDollar = tenEuro.with(dollarConversion);
请注意CurrencyConversion也实现了MonetaryOperator接口。正如其它操作一样,它也能通过MonetaryAmount.with()方法来调用。 格式化及解析 MonetaryAmount可以通过MonetaryAmountFormat来与字符串进行解析/格式化。 -
- MonetaryAmountFormat germanFormat = MonetaryFormats.getAmountFormat(Locale.GERMANY);
- MonetaryAmountFormat usFormat = MonetaryFormats.getAmountFormat(Locale.CANADA);
-
- MonetaryAmount amount = Money.of(12345.67, "USD");
-
- String usFormatted = usFormat.format(amount);
- String germanFormatted = germanFormat.format(amount);
-
-
- MonetaryAmount parsed = germanFormat.parse("12,4 USD");
可以通过AmountFormatQueryBuilder来生成自定义的格式。 -
- MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(
- AmountFormatQueryBuilder.of(Locale.US)
- .set(CurrencyStyle.NAME)
- .set("pattern", "00,00,00,00.00 ¤")
- .build());
-
-
- String formatted = customFormat.format(amount);
注意,这里的¤符号在模式串中是作为货币的占位符。 总结 新的货币API这里已经介绍得差不多了。并且目前它的实现也已经相对稳定了(但还需要多补充些文档)。期待能在Java 9中看到这套新的接口! 上述示例可在Github中下载到。 原文出处:Michael Scharhag 译文来自:Java译站 |