Java实现:将SQL行数据拆分至多个List集合
如何优雅地将数据库行数据按类型拆分到嵌套集合中?
我定义了如下包含多个List依赖的Test类:
class Test{ private List<Image> images; private List<Text> texts; private List<Video> videos; // 省略getter和setter方法 }
我需要从数据库中获取数据,并将行数据拆分至上述各List集合中,拆分规则是根据行数据中的subType字段值判断。目前我编写了如下示例代码:
Test test=new Test(); for(Row dataRow: rowDetails){ if(dataRow.getSubType().equalsIgnoreCase("image")){ if(test.getImages()!=null){ List images=test.getImages(); Image image=new Image(); image.setUrl(dataRow.getURL()); images.add(image); test.setImages(images); }else{ List images=new ArrayList<Image>(); Image image=new Image(); image.setUrl(dataRow.getURL()); images.add(image); test.setImages(images); } }else if(contentModal.getSubType().equalsIgnoreCase("video")){ // 视频类型处理逻辑 }else if(contentModal.getSubType().equalsIgnoreCase("text")){ // 文本类型处理逻辑 } }
请为我提供实现该需求的最优方案。
我来帮你优化这段代码,主要可以从消除重复判空和简化分支逻辑两个角度入手,让代码更简洁易维护:
1. 先优化Test类的集合初始化
原来的Test类中List默认是null,导致每次操作都要判空,我们可以直接在类中初始化空集合,这样后续调用getter时永远不会返回null,省去大量重复的null判断:
class Test{ // 直接初始化空ArrayList,避免后续判空 private List<Image> images = new ArrayList<>(); private List<Text> texts = new ArrayList<>(); private List<Video> videos = new ArrayList<>(); // 省略getter和setter方法(注意getter直接返回已初始化的集合即可) }
2. 简化循环中的分支逻辑
方案一:使用switch-case(简洁直观)
Java 7及以上支持字符串类型的switch-case,相比多层if-else可读性更好,同时统一将subType转小写,避免多次调用equalsIgnoreCase:
Test test = new Test(); for(Row dataRow : rowDetails){ String subType = dataRow.getSubType().toLowerCase(); switch(subType){ case "image": Image image = new Image(); image.setUrl(dataRow.getURL()); test.getImages().add(image); break; case "video": Video video = new Video(); video.setUrl(dataRow.getURL()); // 根据实际字段调整 test.getVideos().add(video); break; case "text": Text text = new Text(); text.setContent(dataRow.getContent()); // 根据实际字段调整 test.getTexts().add(text); break; default: // 处理未知类型,比如打日志或跳过 System.out.println("Unknown subType encountered: " + subType); } }
方案二:使用Map映射处理逻辑(灵活易扩展)
如果后续可能新增更多类型,推荐用Map<String, Consumer<Row>>来存储类型对应的处理逻辑,这样新增类型时只需要添加新的映射条目,无需修改循环主体,符合开闭原则:
Test test = new Test(); // 初始化类型到处理逻辑的映射 Map<String, Consumer<Row>> typeHandlerMap = new HashMap<>(); typeHandlerMap.put("image", row -> { Image image = new Image(); image.setUrl(row.getURL()); test.getImages().add(image); }); typeHandlerMap.put("video", row -> { Video video = new Video(); video.setUrl(row.getURL()); test.getVideos().add(video); }); typeHandlerMap.put("text", row -> { Text text = new Text(); text.setContent(row.getContent()); test.getTexts().add(text); }); // 遍历处理行数据 for(Row dataRow : rowDetails){ String subType = dataRow.getSubType().toLowerCase(); Consumer<Row> handler = typeHandlerMap.get(subType); if(handler != null){ handler.accept(dataRow); } else { System.out.println("Unknown subType encountered: " + subType); } }
优化后的优势
- 彻底消除了重复的null判断,代码更简洁;
- 分支逻辑更清晰,可读性和可维护性提升;
- Map映射方案支持动态扩展类型,后续新增业务类型时改动最小;
- 统一转小写的操作减少了重复的字符串匹配开销,也避免了大小写不一致的问题。
内容的提问来源于stack exchange,提问作者Ragesh ck
相关产品推荐
相关产品推荐

