在 Java 开发中,DAO 层返回 List(如 JPA 原生查询或 JDBC 多字段结果集)后,将其映射为业务实体对象是常见需求。传统写法依赖显式 for 循环和 ArrayList.add(),虽然直观,但长期维护会发现代码冗余且难以扩展。通过 Stream API 重构,能显著提升代码可读性
在 Java 开发中,DAO 层返回 List(如 JPA 原生查询或 JDBC 多字段结果集)后,将其映射为业务实体对象是常见需求。传统写法依赖显式 for 循环和 ArrayList.add(),虽然直观,但长期维护会发现代码冗余且难以扩展。通过 Stream API 重构,能显著提升代码可读性与表达力。
以下是一套推荐的重构方案,基于 JDK 17+ 编写,并提供兼容 JDK 8 的写法,便于根据实际环境灵活选用。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
public ListgetEmployeeList() { return Optional.ofNullable(Dao.getEmpDetailsFromUserMst()) .orElse(Collections.emptyList()) .stream() .map(this::convertToObject) .toList(); // JDK 17 引入,不可变列表 } private AddNewSchoolBean convertToObject(Object[] row) { if (row == null || row.length < 3) { throw new IllegalArgumentException("Invalid row data: " + Arrays.toString(row)); } return AddNewSchoolBean.builder() .employeeId(Objects.toString(row[0], "")) .employeeName(Objects.toString(row[1], "")) .schoolName(Objects.toString(row[2], "")) .build(); }
只需将最后一行的 .toList() 替换为 .collect(Collectors.toList()) 即可:
// 替换上例最后一行 .collect(Collectors.toList());
Optional.ofNullable(...).orElse(...) 替代容易出错的 empList.size() != 0 判断,从源头杜绝 NullPointerException。convertToObject 方法中主动校验数组长度和元素是否为空,配合 Objects.toString() 安全处理 null 字段,即使字段为空也不会导致崩溃。.toList() 返回不可修改列表,防止下游误改数据引发并发或一致性问题。如需可变列表,可额外包裹 new ArrayList<>(...)。Dao.getEmpDetailsFromUserMst() 返回的 Object[] 中各索引位置语义稳定,例如 [0] 为 id,[1] 为 name,[2] 为 schoolName;顺序变化会导致映射错误。.stream() 会抛出 NullPointerException。convertToObject 可能抛出受检异常,需将其包装为运行时异常,或自定义 Function 处理。使用 Stream API 重构后,代码行数可减少约 40%,逻辑更聚焦于“数据转化”本身,可测试性和可维护性显著提升。当然,具体选用哪种方式,还需根据项目 JDK 版本和团队风格决定——但这套方案提供了一个清晰、稳健的参考方向。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述