如何用Java 8 Stream实现数据库数据读取至Model类ArrayList
嘿,我来帮你把这段Java 7的代码改成Java 8 Stream风格的!首先,先理清楚原来的逻辑:查询数据库得到ResultSet,循环每一行转成Customer对象,再塞进ArrayList。用Stream的话,我们需要把ResultSet转换成Stream,再做映射和收集操作,顺便还能优化一下资源管理的问题。
先看修改后的完整代码
import java.sql.*; import java.util.ArrayList; import java.util.Iterator; import java.util.Spliterators; import java.util.stream.Collectors; import java.util.stream.StreamSupport; public class CustomerDAO { // 抽离ResultSet转Customer的逻辑,让代码更清晰 private static Customer mapResultSetToCustomer(ResultSet rs) throws SQLException { return new Customer( rs.getString("id"), rs.getString("name"), rs.getString("address"), rs.getDouble("salary") ); } public static ArrayList<Customer> getAllCustomer() throws ClassNotFoundException, SQLException { // 用try-with-resources自动关闭资源,避免连接泄漏(比原来的代码更安全) try (Connection conn = DBConnection.getDBConnection().getConnection(); Statement stm = conn.createStatement(); ResultSet rst = stm.executeQuery("Select * From Customer")) { // 把ResultSet包装成Iterator,因为ResultSet本身不支持Stream Iterator<Customer> customerIterator = new Iterator<>() { @Override public boolean hasNext() { try { return rst.next(); } catch (SQLException e) { // 把检查型异常转成非检查型,适配Iterator的方法签名 throw new SQLException(e); } } @Override public Customer next() { try { return mapResultSetToCustomer(rst); } catch (SQLException e) { throw new SQLException(e); } } }; // 从Iterator生成Stream,再收集到ArrayList中 return StreamSupport.stream( Spliterators.spliteratorUnknownSize(customerIterator, 0), false // false表示串行处理,和原来的while循环逻辑一致 ) .collect(Collectors.toCollection(ArrayList::new)); } } }
关键改动说明
- 资源管理优化:用
try-with-resources自动关闭Connection、Statement、ResultSet,不用手动写finally块,彻底避免数据库连接泄漏的问题。 - ResultSet转Stream:因为
ResultSet本身没有提供stream()方法,我们用匿名Iterator包装它的遍历逻辑,再通过StreamSupport.stream()把Iterator转换成Stream。 - 映射与收集:用
collect(Collectors.toCollection(ArrayList::new))把Stream中的Customer对象收集到ArrayList里,效果和原来的new ArrayList<>()+add()完全一致。 - 代码解耦:把
ResultSet转Customer的逻辑抽成私有方法,让主方法的逻辑更清晰,也方便后续维护。
额外小提示
如果你的项目里用了Spring JDBC或者其他ORM框架,其实有更简洁的方式处理ResultSet转Stream,但如果要纯Java 8原生实现,上面的代码就是最标准的写法啦。
内容的提问来源于stack exchange,提问作者Arpit Gupta
相关产品推荐
相关产品推荐

