Java如何简化对象列表的查找与统计相关代码?
代码优化方案
首先先纠正你代码里的几个明显问题:
- 字符串比较不能用
==,要改用equals()方法(需忽略大小写可使用equalsIgnoreCase()) Client类缺少必要的getter/setter方法,getFullName()方法也未实现getClientName()方法返回类型定义为void却返回字符串,会触发编译错误getNumberOfSubsrtipion()方法名拼写错误,应为getNumberOfSubscriptions- 遍历中错误引用
myClient.clientID,实际应该是myCustomer.cID myCustomer.getSubscription缺少方法调用括号,应为myCustomer.isSubscription()或myCustomer.getSubscription()
第一步:完善Client类
先补全Client类的基础方法,保证后续逻辑可正常运行:
public class Client { private String firstName; private String lastName; private String cID; private boolean subscription = false; // 可选构造方法,方便快速创建客户对象 public Client(String firstName, String lastName, String cID) { this.firstName = firstName; this.lastName = lastName; this.cID = cID; } // getter/setter方法 public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getcID() { return cID; } public void setcID(String cID) { this.cID = cID; } public boolean isSubscription() { return subscription; } public void setSubscription(boolean subscription) { this.subscription = subscription; } // 实现获取全名的方法 public String getFullName() { return firstName + " " + lastName; } }
第二步:用Stream API简化业务方法
Java 8及以上的Stream API可以大幅简化遍历、过滤、统计类逻辑,让代码更简洁易读:
1. 激活订阅(activateSubscription)
// 若无需返回结果,直接修改状态即可 public void activateSubscription(String customerID) { myClient.stream() .filter(client -> customerID.equals(client.getcID())) .findFirst() .ifPresent(client -> client.setSubscription(true)); } // 若需要返回是否激活成功,可改为boolean类型返回值 public boolean activateSubscription(String customerID) { return myClient.stream() .filter(client -> customerID.equals(client.getcID())) .findFirst() .map(client -> { client.setSubscription(true); return true; }) .orElse(false); }
2. 获取客户名称(getClientName)
public String getClientName(String customerID) { return myClient.stream() .filter(client -> customerID.equals(client.getcID())) .map(Client::getFullName) .findFirst() .orElse(null); // 找不到客户时返回null,也可改为返回空字符串"" }
3. 统计订阅客户数量(getNumberOfSubscriptions)
public long getNumberOfSubscriptions() { return myClient.stream() .filter(Client::isSubscription) .count(); }
第三步:优化按ID查找的效率
如果业务中频繁需要按客户ID查询,每次遍历List的时间复杂度为O(n),可以将List转为Map<String, Client>(以cID为key),将查找时间复杂度降至O(1):
// 新增Map缓存客户,和List保持同步(也可只维护Map,根据业务需求选择) private Map<String, Client> clientMap = new HashMap<>(); // 添加客户时同时更新List和Map public void addClient(Client client) { myClient.add(client); clientMap.put(client.getcID(), client); } // 用Map实现激活订阅 public void activateSubscription(String customerID) { Client client = clientMap.get(customerID); if (client != null) { client.setSubscription(true); } } // 用Map实现获取客户名称 public String getClientName(String customerID) { Client client = clientMap.get(customerID); return client != null ? client.getFullName() : null; }
内容的提问来源于stack exchange,提问作者Qmails
相关产品推荐
相关产品推荐

