如何用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
相关产品推荐
相关产品推荐

