【发布时间】:2016-07-28 08:39:57
【问题描述】:
这是代码。假设数据库中有很多大图像,所以我想一次只在内存中保留一个。如何使用 JDK 8 功能(如 lambda 和流)编写此代码?
我开始使用这些,但它一直失败(来自https://spring.io/guides/gs/relational-data-access/ 和www.jooq.org/java-8-and-sql)并且使用 ResultSetExtractor 可以正常工作,但是有没有办法在没有 ResultSetExtractor 的情况下做到这一点?
jdbcTemplate.query(
"select id,image,mimetype from images",
new ResultSetExtractor(){
@Override
public List extractData(ResultSet rs) throws SQLException, DataAccessException {
while(rs.next()){
createThumbnail( new ImageHolder(rs.getInt("id"), rs.getBytes("image"), rs.getString("mimetype") ));
}
return null;
}
}
);
这是一个看起来不错的流/lambda 版本,它可以工作,但在内存中保存了太多东西,迟早会提供 OOME。
jdbcTemplate.query(
"select id,image,mimetype from images",
(rs,rowNum)->new ImageHolder(rs.getInt("id"), rs.getBytes("image"),rs.getString("mimetype"))
).stream().forEach(
imageHolder -> createThumbnail(imageHolder)
) );
这只是在开始“流式传输”它们之前加载所有行。
【问题讨论】:
标签: spring lambda stream java-8 jdbctemplate