如何从地图列表中获取累计金额总额



在我的一个例子中,我得到了下面这样的输入,其中有一个包含Maps列表的列表。

List<Map<String, String>> actAllSavAccDetLists = test1Page.getAllSavingsAccountsDetails();
// returns like this
[
{Savings=Account ****2623, Current Balance=$22000.00, Annual Rate=7.77%, Transfer=Make a Transfer, Ellipses=...}, 
{Savings=Account ****5678, Current Balance=$11000.00, Annual Rate=2.22%, Transfer=Make a Transfer, Ellipses=...}
]

现在我需要找到用户的总余额,即。;将Map中的所有当前余额添加到列表中。

假设在这种情况下,将22000.00美元+111000.00美元相加,得出的结果为total_bal变量中的33000.00美元。

您可以轻松使用java流映射->减少以使:

Double totalBalance = actAllSavAccDetLists.stream()
.map(e -> e.get("Current Balance").substring(1))
.map(e -> new BigDecimal(e))
.reduce(BigDecimal.ZERO, BigDecimal::add);

与java兼容的方法是根本不使用此映射。Java名义上是类型化的,并且非常喜欢它的类型。CCD_ 1在这里不是合适的数据类型。

  1. 首先,创建一个表示储蓄帐户的类
  2. 接下来,不具有List<Map<String, String>>,而具有List<SavingsAccount>
  3. 最后,总结余额

创建类

看起来应该是这样的:

@lombok.Value
public class SavingsAccount {
String accountId;
int balance; // in cents
double rate; // might need to be BigDecimal
}

您需要将其修饰为一个合适的java类(字段必须是final和private,getter和setter必须在那里,构造函数、equals、toString等(。我在这里使用lombok(免责声明:我是开发人员之一(,但您也可以使用java16record,或者使用IDE生成所有这些东西。

将混乱转化为SavingsAccount的实例

例如,将包含映射Transfer=Make a Transfer的映射转换为该映射的实例强烈表明您的输入来自某个奇怪的来源。你会比我们更清楚如何转换它。你现在可以将所有需要的转换和开放式问题本地化到一个地方。例如,如果map.get("CurrentBalance")不存在,或者返回";10000.00欧元;?

这归结为";如何将字符串CCD_ 8转换为整数CCD_;,或";如何将CCD_ 10转换为CCD_;,这并不困难,也是一个无关的问题;如果你有问题,我相信它已经在SO上被回复了一百万次,所以你可以通过网络搜索很快找到它。

总结

这很琐碎:

List<SavingsAccount> accounts = ...;
int sum = accounts.stream().mapToInt(SavingsAccount::getBalance).sum();

这会对所有账户进行流式处理,只提取每个账户的余额,然后将整个流相加为一个数字。

我不想上那堂课

好吧,用理智的java程序员永远不会做的方式做事有点傻。如果你试图学习,你就会学到错误的工作方式。如果你试图提供自由职业,你会得到负面评价。如果你是";"匆匆忙忙";,现在走捷径只会让你以后花三倍的钱。你确实想成为那个类。

如果你坚持固执,同样的技巧也可以使用,只是顺序混乱。您可以将提取余额的代码粘贴在Map<String, String>2调用中:

.mapToInt(s -> extractBalanceFromThisBizarroMap(s))

然后自己写CCD_ 14。

但不要那样做。

最新更新