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

如何用Java 8实现List中Salary对象的ID匹配、积分累加与新增?

用Java 8实现Salary列表的更新逻辑

嘿,这个需求用Java 8的Stream API或者结合Optional就能优雅解决,我给你两种实用的实现方式,你可以根据自己的场景来选:

方法一:直接基于原List操作

这种方式适合列表数据量不大的场景,直接用Stream查找目标对象,再通过Optional处理存在/不存在的情况:

public class Info {
    public static void main(String[] args) {
        List<Salary> salaries = new ArrayList<>();
        salaries.add(new Salary(1,100));
        salaries.add(new Salary(2,200));
        Salary newSalary = new Salary(1,200);

        // 查找列表中是否存在相同id的Salary对象
        Optional<Salary> existingSalary = salaries.stream()
                .filter(s -> s.getId() == newSalary.getId())
                .findFirst();

        if (existingSalary.isPresent()) {
            // 存在的话,把原有对象的points加1
            Salary target = existingSalary.get();
            target.setPoints(target.getPoints() + 1);
        } else {
            // 不存在就直接加新对象到列表里
            salaries.add(newSalary);
        }

        // 打印验证结果:id为1的points应该变成101
        salaries.forEach(s -> System.out.printf("id: %d, points: %d%n", s.getId(), s.getPoints()));
    }
}

方法二:用HashMap优化查找效率

如果你的列表数据量比较大,每次用Stream遍历查找的时间复杂度是O(n),这时候转成HashMap来处理会更高效(查找是O(1)):

public class Info {
    public static void main(String[] args) {
        List<Salary> salaries = new ArrayList<>();
        salaries.add(new Salary(1,100));
        salaries.add(new Salary(2,200));
        Salary newSalary = new Salary(1,200);

        // 把List转成以id为key的HashMap
        Map<Integer, Salary> salaryMap = salaries.stream()
                .collect(Collectors.toMap(Salary::getId, s -> s));

        if (salaryMap.containsKey(newSalary.getId())) {
            // 存在就给对应对象的points加1
            Salary existing = salaryMap.get(newSalary.getId());
            existing.setPoints(existing.getPoints() + 1);
        } else {
            // 不存在就把新对象放进Map
            salaryMap.put(newSalary.getId(), newSalary);
        }

        // 如果需要转回List的话
        salaries = new ArrayList<>(salaryMap.values());

        // 验证结果
        salaries.forEach(s -> System.out.printf("id: %d, points: %d%n", s.getId(), s.getPoints()));
    }
}

小提醒

  • 一定要确保你的Salary类已经正确实现了getId()和setPoints()方法哦,你提到已经有getters和setters,那这块就没问题啦~
  • 如果你的原始列表里可能存在重复id的情况(虽然需求里应该是唯一id),转Map的时候会抛出IllegalStateException,这时候可以用Collectors.toMap(Salary::getId, s -> s, (oldVal, newVal) -> oldVal)来指定冲突时保留旧值。

内容的提问来源于stack exchange,提问作者TheProfiler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:40:06