我试图在 lambda 调用中打印到系统控制台,但它没有显示在输出窗口中(在 IDE 中以及作为 mvn test 运行时)
这是代码
public List<FieldDto> findField(String fieldKey) {
jdbcTemplate.setQueryTimeout(10);
System.out.println("\n\n\n\n ----------- seeeee ----------------------");
List<FieldDto> result = jdbcTemplate.query("select * from V_FIELD where FIELD_KEY = '" + fieldKey + "'",
(rs, rowNum) -> getFieldDto(rs, rowNum)
);
System.out.println("\n\n\n\n ----------- done ----------------------");
return result;
}
并且方法 getFieldDto 定义为
private FieldDto getFieldDto(ResultSet rs, int rowNum) throws SQLException {
FieldDto fieldDto = new FieldDto();
System.out.println(" .. in getFieldDto:");
try {
fieldDto.FIELD_KEY = rs.getString("FIELD_KEY");
fieldDto.CREATE_DATE = rs.getString("CREATE_DATE");
} catch (Exception ex) {
System.out.println(" exception getFieldDto:" + ex.getMessage());
throw new RuntimeException(ex);
}
return fieldDto;
}
当我运行 jUnit 测试时,控制台确实显示 ---see--- 和 ----done---,控制台日志,但不是“.. in getFieldDto”
为什么没有发生这种情况,我如何在 Lambda 调用中打印
最佳答案
lambda 表达式使用单个方法创建匿名内部类的实例。创建时不会调用该方法。相反,它会在稍后的某个时刻作为回调被调用。
我相信您想立即调用该方法并将结果作为参数传递。所以就这么做吧!不要将调用包装在 lambda 表达式中:
List<FieldDto> result = jdbcTemplate.query("select * from V_FIELD where FIELD_KEY = '" + fieldKey + "'",
getFieldDto(rs, rowNum));
此外,您应该非常小心连接字符串来创建 SQL 查询。如果您连接一个其值来自用户输入的字符串,这可能会使您的应用程序容易受到 SQL 注入(inject)攻击。相反,您应该在查询中使用类似 FIELD_KEY = ?
的语法,以及为 ?
占位符提供参数的适当 JDBC 调用。然后 JDBC 将清理所有输入以降低受到攻击的风险。
关于java - 如何在 Java 8 中的 lambda 调用中打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043630/