我正在尝试遍历结果集并输出内容。使用lambda,我能够输出我想要的键,但是为了获取值,我需要引用范围上的变量。如何引用在lambda表达式之外定义的变量。?
public static void SQLSelect(Connection c, String sql, String table) {
ResultSet rs;
Statement stmt;
try {
stmt = c.createStatement();
rs = stmt.executeQuery("PRAGMA table_info(" + table + ")");
ArrayList al = new ArrayList();
while (rs.next()) {
al.add(rs.getString("name"));
}
rs = stmt.executeQuery(sql + " FROM " + table);
while (rs.next()) {
al.forEach((item) -> {
// complains here about local variable needing to be final
System.out.println(item + ": " + rs.getString("address"));
});
System.out.println();
}
rs.close();
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
}
答案 0 :(得分:1)
编译器告诉你“rs”必须是最终的。也就是说,您只需为其赋值一次,并且不会在整个范围内更改其值。但是你需要为rs分配值的语句:
rs = stmt.executeQuery("PRAGMA table_info(" + table + ")");
和
rs = stmt.executeQuery(sql + " FROM " + table);
答案 1 :(得分:1)
lambda中使用的变量必须是最终的或有效的最终变量。 rs
不是最终的,因为它被分配了两次。只需将第二个版本替换为另一个变量。
ResultSet rs2 = stmt.executeQuery(sql + " FROM " + table);
while (rs2.next()) {
al.forEach((item) -> {
// No longer complains
System.out.println(item + ": " + rs2.getString("address"));
});
System.out.println();
}