java - 转换列表> 流式传输
问题描述
我有一个这种类型的List<HashMap<String, Object>>
ResultSet 列表,其中包含对数据库的查询结果。我想在 List 对象上调用 stream()。我怎么做 ?此代码创建我的列表:
public class ResultSetToMap {
int Columns = 0;
List<Map<String, String>> data = new ArrayList<Map<String, String>>();
HashMap<String, Object> row = new HashMap<>();
public List ResultSetToMap(ResultSet rs) throws SQLException {
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
while (rs.next()) {
row = new HashMap<String, Object>(columns);
for (int i = 1; i <= columns; ++i) {
row.put(md.getColumnName(i), rs.getObject(i));
}
list.add(row);
}
return list;
}
}
我可以这样查询列表数据:
for (HashMap<String, Object> map : list) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
我想稍后对这些数据进行查询。类型:
films.stream()
.filter(Film.LENGTH.greaterThan(60))
.sorted(Film.TITLE)
.forEach(System.out::println);
解决方案
除了您应该在 SQL 中更好地过滤和排序数据之外,您还应该使用 ObjectFilm
而不是Map
:
public class Film {
private String title;
private int length;
// more attributes if you have ...
public Film(String title, int length) {
this.title = title;
this.length = length;
}
public String getTitle() {
return title;
}
public int getLength() {
return length;
}
@Override
public String toString() {
return title + " : " + length;
}
}
现在您可以在创建结果列表时使用它:
public List<Film> getFilmsFromResultSet(ResultSet rs) throws SQLException {
List<Film> result = new ArrayList<>();
while (rs.next()) {
result.add(new Film(rs.getString("TITLE"), rs.getInt("LENGTH")));
}
return result;
}
rs.getInt()
在andrs.getString()
方法中使用表中的列名。
getFilmsFromResultSet()
像这样使用你的方法:
List<Film> films = getFilmsFromResultSet(rs);
films.stream()
.filter(f -> f.getLength() > 60)
.sorted(Comparator.comparing(Film::getTitle))
.forEach(System.out::println);
推荐阅读
- java - 带有 Spring 的 DDD Java - 返回 Mono/Flux 的存储库
- reactjs - Redux - 当我调度一个动作时,Reducer 没有被调用
- r-markdown - 如何将 YAML 中的动态参数传递到 word 文档每一页中出现的标题?
- google-apps-script - 将工作表保持在 500 行
- javascript - OpenLayers ZoomSlider 没有出现
- c++ - 如何在 C++ 中将二维向量转换为一维数组?
- javascript - 如何使复选框单独与输入字段一起使用
- javascript - 如何自定义音频播放器?
- vb.net - 谁赢得了比赛?
- mysql - 如何使用内部联接创建触发器