如何在Java中使用Streams替代forEach循环实现数据库查询加载
用Streams流改写代码的方案
步骤1:重构查询方法
先把原方法改成仅负责查询并返回结果的无副作用方法,去掉对外部集合的依赖:
private Load executeQuery(LocalDate date) { MapSqlParameterSource source = new MapSqlParameterSource(); source.addValue("date", date.toString()); return namedJdbcTemplate.queryForObject(Constants.SQL_QUERY, source, new BeanPropertyRowMapper<>(Load.class)); }
步骤2:用Streams处理集合
方案1:直接生成新集合(推荐,符合函数式风格)
通过流的map操作把每个日期转换为对应的Load对象,最后收集成新集合:
List<Load> loads = dates.stream() .map(this::executeQuery) .collect(Collectors.toList());
方案2:添加到已有集合
如果需要把结果追加到已存在的loads集合中,可使用forEach完成:
dates.stream() .map(this::executeQuery) .forEach(loads::add);
说明
- 重构后的
executeQuery职责更单一,只专注于查询逻辑,避免了操作外部集合的副作用 - Streams写法省去了手动遍历和集合添加的样板代码,逻辑表达更直接清晰
内容的提问来源于stack exchange,提问作者sgsg
相关产品推荐
相关产品推荐

