这是代码.假设数据库中有很多大图像,所以我一次只想保留一个图像.如何使用lambda和stream之类的JDK 8功能编写此代码?
我开始使用它们,但是它一直失败(从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)
) );
这只是在开始“流式处理”它们之前加载所有行.
解决方法:
一种解决方案是在第一个lambda中移动缩略图的生成,直接翻译您的第一个示例.
jdbcTemplate.query(
"select id,image,mimetype from images",
(rs,rowNum)-> {
createThumbnail(new ImageHolder(
rs.getInt("id"),
rs.getBytes("image"),
rs.getString("mimetype") ));
})
)
要拥有与您尝试实现查询方法类似的结构,应返回一个流,这样您就不必在流传输之前收集所有内容.