如何在Java 8中的lambda调用中打印到控制台

时间:2017-07-11 20:07:32

标签: java lambda

我正在尝试在lambda调用中打印到系统控制台,但它没有显示在输出窗口中(在IDE中和作为mvn测试运行时)

这是代码

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测试时,控制台确实显示了 ---看---和----完成---,控制台日志,但不是getFieldDto&#39;

中的&#39; ..

为什么没有发生,我如何在Lambda调用中打印

1 个答案:

答案 0 :(得分:1)

lambda表达式使用单个方法创建匿名内部类的实例。在创建时不调用该方法。相反,它稍后会被称为回调。

我相信你想立即调用该方法并将结果作为参数传递。那就是这样做的!不要将调用包装在lambda表达式中:

List<FieldDto> result = jdbcTemplate.query("select * from V_FIELD where FIELD_KEY = '" + fieldKey + "'",
         getFieldDto(rs, rowNum));

此外,您应该非常谨慎地连接字符串以创建SQL查询。如果您连接一个值来自用户输入的String,这可能会使您的应用程序对SQL注入攻击开放。相反,您应该在查询中使用FIELD_KEY = ?之类的语法以及为?占位符提供参数的相应JDBC调用。然后,JDBC将清除所有输入以降低攻击风险。