繁体   English   中英

更新列表中现有的 object

[英]update an existing object in list

问:我有一个包含多个贷款账户(LoanAccount 类)的银行 class。 我创建了一个具有 CRUD 功能的 LoanAccountService。 我担心的是我如何实现更新功能。

银行

public class Bank {
    private List<LoanAccount> loanAccounts;
}

贷款账户

public class LoanAccount {
    private String id;
    private Integer numberOfInstallments;
    private LoanAccountType type;
    private Date creationDate;
    private BigDecimal loanAmount;
}

服务

public class LoanAccountService{

    private Bank bank;

    public LoanAccountService(Bank bank) {
        this.bank = bank;
    }

    public LoanAccount update(LoanAccount loanAccount) {
        Optional<LoanAccount> account = bank.getLoanAccounts()
                .stream()
                .filter(la -> la.getId().equals(loanAccount.getId()))
                .findAny();
        if (account.isPresent()) {
            account.get().setCreationDate(loanAccount.getCreationDate());
            account.get().setLoanAmount(loanAccount.getLoanAmount());
            account.get().setNumberOfInstallments(loanAccount.getNumberOfInstallments());
            account.get().setType(loanAccount.getType());
        } else {
            throw new IllegalArgumentException("The object does not exist.");
        }
        return loanAccount;
    }
}

当使用包含 LoanAccounts 列表中已经存在的 id 的 LoanAccount 调用方法更新时,我想使用给定的 object loanAccount 作为参数更新现有的 object。

以上是我的实现,但我觉得应该有更好的方法来做到这一点。

  1. 将 Builder 用于 getter 和 setter

     public class LoanAccount { private String id; private Integer numberOfInstallments; // add other properties public String getId() { return id; } public LoanAccount setId(String id) { this.id = id; return this; } public Integer getNumberOfInstallments() { return numberOfInstallments; } public LoanAccount setNumberOfInstallments(Integer numberOfInstallments) { this.numberOfInstallments = numberOfInstallments; return this; }
  2. 使用此更新方法

    public LoanAccount update(LoanAccount loanAccount) { return bank.getLoanAccounts().stream().filter(la -> la.getId().equals(loanAccount.getId())).findFirst().orElseThrow(IllegalArgumentException::new).setCreationDate(loanAccount.getCreationDate()).setLoanAmount(loanAccount.getLoanAmount()).setNumberOfInstallments(loanAccount.getNumberOfInstallments()).setType(loanAccount.getType()); }

您可以使用 HashMap,其中 TKey 是 LoanAccount.id 的类型。 然后调用loanAccounts.put(id, object)如果已经有一个Id,这将更新object,如果没有,则添加一个新的object。

这是一种廉价、肮脏的方式。 另一种方法是让您的 LoanAccount class 实现Comparable并在compareTo()方法中进行基于 id 的比较。 做同样的事情覆盖你的equals() ,你应该准备好go。

@Override
public boolean equals(object obj) {
    if (obj == null) return false;

    return ((LoanAccount)obj).getId() == this.getId();
}

类似的东西。 (由 memory 编写的代码,可能会出现错误并且缺少数据类型等验证)

  1. 你使用什么样的持久层?
  2. 为什么你需要遍历所有的银行账户?
  3. 您是否从存储库中获取所有帐户并遍历服务层? 如果是,为什么?
  4. 为什么不从存储库中获取相应的单个记录并更新?
  5. 您为什么不使用查找和更新记录而不是使用上述几点?

    这些问题可能会给你一个想法。 如果你回答它! 如果不是让我们更深入地讨论

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM