Java实现:List间按ID复制Status名称及补全空ID的Status
问题解决方案
实体类定义
class Status{ private Integer id; // 注:原定义为int,无法存储空值,这里调整为Integer适配场景 private String name; private String savedBy; // constructor // getters and setters } class Event{ private String title; private DateTime effectiveDate; private Status status; // constructor, getter and setters }
场景说明
Service类中存在两个元素数量相同的Event列表listA和listB:
listA包含完整的Event对象,示例数据:
listA.get(0).getStatus().getId() = 101 listA.get(0).getStatus().getName() = "Bruce Wayne" listA.get(1).getStatus().getId() = 202 listA.get(1).getStatus().getName() = "Ra Al Ghul" listA.get(2).getStatus().getId() = 303 listA.get(2).getStatus().getName() = "Alfred Pennyworth"
listB的Event中Status字段存在差异:Status.id可能与listA对应位置相同或为null,且Status.name均为空,示例数据:
listB.get(0).getStatus().getId() = null listB.get(1).getStatus().getId() = 700 listB.get(2).getStatus().getId() = 303
问题1:当listA与listB对应位置Event的Status.id相同时,将listA的Status.name复制到listB对应位置的Status.name
普通Java写法
for (int i = 0; i < listA.size(); i++) { Event eventA = listA.get(i); Event eventB = listB.get(i); Status statusA = eventA.getStatus(); Status statusB = eventB.getStatus(); // 校验id非空且相等 if (statusA.getId() != null && statusB.getId() != null && statusA.getId().equals(statusB.getId())) { statusB.setName(statusA.getName()); } }
Lambda表达式写法
IntStream.range(0, listA.size()) .forEach(i -> { Status statusA = listA.get(i).getStatus(); Status statusB = listB.get(i).getStatus(); if (statusA.getId() != null && statusB.getId() != null && statusA.getId().equals(statusB.getId())) { statusB.setName(statusA.getName()); } });
问题2:当listB中Event的Status.id为空时,用listA对应位置的完整Status替换listB的Status
普通Java写法
for (int i = 0; i < listA.size(); i++) { Event eventA = listA.get(i); Event eventB = listB.get(i); Status statusB = eventB.getStatus(); // 判断Status.id是否为空 if (statusB.getId() == null) { // 复制listA的完整Status对象(避免引用共享) Status newStatus = new Status(); newStatus.setId(eventA.getStatus().getId()); newStatus.setName(eventA.getStatus().getName()); newStatus.setSavedBy(eventA.getStatus().getSavedBy()); eventB.setStatus(newStatus); } }
Lambda表达式写法
IntStream.range(0, listA.size()) .forEach(i -> { Event eventA = listA.get(i); Event eventB = listB.get(i); Status statusB = eventB.getStatus(); if (statusB.getId() == null) { Status newStatus = new Status(); newStatus.setId(eventA.getStatus().getId()); newStatus.setName(eventA.getStatus().getName()); newStatus.setSavedBy(eventA.getStatus().getSavedBy()); eventB.setStatus(newStatus); } });
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

