Discuss / Java / 廖老师,请问这一节提到的jdbcTemplate的回调是怎么一回事呢

廖老师,请问这一节提到的jdbcTemplate的回调是怎么一回事呢

Topic source

wangzezhong00

#1 Created at ... [Delete] [Delete and Lock User]

前面好像没有提到过java的回调机制吧,我从网上查了查回调, 也没看出这里是怎样用回调的

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

写个计算个税的计算器:

public class TaxTemplate {

    public double getTax(double total, Callable<Double> taxBase) {
        return (total - taxBase()) * 0.1;
    }

}

传入的Callable就是回调,具体返回啥,由调用者决定

你再对比JdbcTemplate:

public Object queryForObject(String sql, RowMapper mapper) {
    try (conn = connect(...)) {
        try (Statement st = conn.createStatement(sql)) {
            try (ResultSet rs = st.executeQuery()) {
                if (rs.next()) {
                    return mapper.mapRow(rs);
                }
            }
        }
    }
}

那个RowMapper就是回调,如何把ResultSet变成Object,调用者自己决定

知乎上有个回答讲得挺好,可以去看下

回调函数(callback)是什么?

我简单说一下我的理解

回调函数首先是个函数(方法),有函数就是为了被调用,回调函数就是与直接调用的函数不相同另一类函数。

拿这一节第一个函数——JdbcTemplate.execute(ConnectionCallback<User> action)来说,这里是阻塞式回调(参考链接内容),有三个参与者或者说对象,运行环境,被调用的库(jdbcTemplate),包含了传入的回调函数的action。而回调函数就是在被运行环境借action传入到JdbcTemplate之后,由JdbcTemplate回过头来调用的,即所谓回调。

我猜你可能还是对函数式编程没太理解,把action单独声明之后在传入就清楚很多。

廖老师的例子,就是调用者函数,和被调函数这两个,,,将被调函数当做参数传入调用者函数,具体返回什么由调用者函数内部进行处理,其实就是函数式编程的一个典型例子,就是函数可以作为参数传入另一个函数

终于明白了。。。

感觉java还是麻烦,层级看的人比较晕,,看了python的函数式编程那个章节再理解java的就很清楚了,java的各种返回类型还有花括号看的人真的头晕,如果不是因为工作,还是喜欢用python


  • 1

Reply