You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:11:07