如何从java lambda内部访问外部作用域变量

时间:2016-01-26 23:43:42

标签: java

我正在尝试遍历结果集并输出内容。使用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);

    }
}

2 个答案:

答案 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();
    }