You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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));
        }
    }
}

关键改动说明

  1. 资源管理优化:用try-with-resources自动关闭Connection、Statement、ResultSet,不用手动写finally块,彻底避免数据库连接泄漏的问题。
  2. ResultSet转Stream:因为ResultSet本身没有提供stream()方法,我们用匿名Iterator包装它的遍历逻辑,再通过StreamSupport.stream()把Iterator转换成Stream。
  3. 映射与收集:用collect(Collectors.toCollection(ArrayList::new))把Stream中的Customer对象收集到ArrayList里,效果和原来的new ArrayList<>()+add()完全一致。
  4. 代码解耦:把ResultSet转Customer的逻辑抽成私有方法,让主方法的逻辑更清晰,也方便后续维护。

额外小提示

如果你的项目里用了Spring JDBC或者其他ORM框架,其实有更简洁的方式处理ResultSet转Stream,但如果要纯Java 8原生实现,上面的代码就是最标准的写法啦。

内容的提问来源于stack exchange,提问作者Arpit Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:46:41