Sam*_*ala 2 java lambda java-8 java-stream
我有一个Invoice对象列表,其中包含属性频率和数量(BigDecimal).
1)需要在不考虑精度的情况下,根据频率乘以和改变量.在下面显示的代码中输出但是输出失去了一些精度.金额值应为100.
2)是否可以用Java 8流API替换发票列表中的金额值.尝试使用
invoiceList.forEach(s -> s.getAmount().multiply(new BigDecimal("10")));
Run Code Online (Sandbox Code Playgroud)
但是这不会取代对象中的金额值.在这种情况下无法弄清楚使用replaceAll,尝试下面的代码,但给出编译错误,
newList.replaceAll((v) -> v.getAmount().multiply(frequencyFactor.get(v.getFrequency())));
Run Code Online (Sandbox Code Playgroud)
整个主要课程如下.无法更改任何数据类型或设计.我必须从Web服务处理获取的列表.
public class InvoiceMain {
public static void main(String[] args) {
List<Invoice> invoiceList = Arrays.asList(new Invoice("Quarterly", new BigDecimal(300)), new Invoice("Annually", new BigDecimal(1200)));
Map<String, BigDecimal> frequencyFactor = new HashMap<>();
frequencyFactor.put("Annually", new BigDecimal(1.0 / 12));
frequencyFactor.put("Quarterly", new BigDecimal(1.0 / 3));
for (Invoice invoice : invoiceList) {
invoice.setAmount(invoice.getAmount().multiply(frequencyFactor.get(invoice.getFrequency())));
}
System.out.println(invoiceList);
}
}
class Invoice {
private String frequency;
private BigDecimal amount;
public Invoice(String frequency, BigDecimal amount) {
super();
this.frequency = frequency;
this.amount = amount;
}
public String getFrequency() {
return frequency;
}
public void setFrequency(String frequency) {
this.frequency = frequency;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
@Override
public String toString() {
return "Invoice [frequency=" + frequency + ", amount=" + amount + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
[Invoice [frequency=Quarterly, amount=99.999..], Invoice [frequency=Annually, amount=99.999...]]
Run Code Online (Sandbox Code Playgroud)
所需的输出是
[Invoice [frequency=Quarterly, amount=100], Invoice [frequency=Annually, amount=100]]
Run Code Online (Sandbox Code Playgroud)
该缺陷使用BigDecimal构造函数和double.然后BigDecimal无法确定精度并使用一个适合double的精度,也会引入一个inprecise值(来自double).
new BigDecimal(1.0/12)
Run Code Online (Sandbox Code Playgroud)
将最佳方式更改为之后除以12:使用divideBy.
Map<String, BigDecimal> divisors = ...
divisors.put("Anually", BigDecimal.valueOf(12));
...
final Map<String, BigDecimal> finalDivisors = divisors;
BigDecimal sum = invoiceList.stream()
.map(inv -> inv.amount.divideBy(finalDivisors.get(inv.frequency))
.sum();
Run Code Online (Sandbox Code Playgroud)
在实际代码中:
static class Invoice {
final BigDecimal amount;
final int months;
Invoice(BigDecimal amount, int months) {
this.amount = amount;
this.months = months;
}
}
public static void main(String[] args) {
List<Invoice> invoices = Arrays.asList(
new Invoice(new BigDecimal("12.50"), 3),
new Invoice(new BigDecimal("120.50"), 12),
new Invoice(new BigDecimal("7.25"), 3));
BigDecimal sum = invoices.stream()
.map(inv -> inv.amount.divide(BigDecimal.valueOf(inv.months),
RoundingMode.HALF_UP))
.reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println("Sum: " + sum); // 16.63
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
647 次 |
| 最近记录: |