3分钟理解完java中的回调函数

定义

函数A执行时需要先给它传递函数B, 好在合适的时候调用, 以完成函数A. 这个被传入的函数B被称为回调函数(Callback function).

如何理解

在调用库中某些预先备好的目标函数时, 需要先给该函数传递另一个函数, 让库中的目标函数在合适的时候, 去调用传给它函数来完成目标函数.

打个比方 假如你去一家餐厅吃饭, 你告诉服务员说你要吃饭, 然后她会让你对着菜单点菜, 你点完菜后她就会陆续地将才给你上来. 你要吃饭的行为就相当于库中的目标函数(通常称之为中间函数), 但进行这个行为前, 你需要告诉服务员你要点什么, 点什么菜是由你决定的, 点菜的这个行为也就是回调函数.

与函数间调用不同的是: 中间函数在接收一个回调函数前是不完整的; 通过实回调函数实现的不同,可以改变中间函数的行为, 所以它非常灵活

如何使用回调函数

1. 首先定义一个回调函数的接口, 方便回调函数能根据业务的不同,实现不同的实例.

/**
 * @author Huzz
 * @created 2021-11-11 13:40
 */
public interface CallbackInterface {

    /**
     * 回调函数
     * @param param
     * @return
     */
    boolean process(String param);

}

2. 定义中间函数, 并在中间函数中调用回调函数. 中间函数时你直接使用的函数, 你只是在该函数中调用了你定义的回调函数, 它和普通函数没有什么区别.

/**
 * @author Huzz
 * @created 2021-11-11 13:38
 */
@Data
public class Huzz {
    /**
     * 中间函数
     * @param callbackInterface 回调函数
     */
    public String execute(CallbackInterface callbackInterface){
        System.out.println("before: 中间函数的内容");
        boolean result = callbackInterface.process("TEST");
        System.out.println("after: 中间函数的内容");
        return result ? "相同": "不相等";

    }


}

3. 使用回调函数.

public static void main(String[] args) {
        /**
         * 这是我们要使用的对象.
         * 此刻我们需要在这个对象中调用一个函数去做一些事情(这个函数比较特殊, 被叫做中间函数).
         * 于是我们先实例化这个对象
         */
        Huzz huzz = new Huzz();

        /**
         * 调用中间函数: execute()
         * 执行中间函数的时候需要先给它传递一个函数作为参数,这个函数叫做回调函数: process()
         * 回调函数写法:
         *          // 拉姆达表达式
         *          param -> {}
         *          或
         *          // 通常写法
         *          new CallbackInterface() {
         *             @Override
         *             public Boolean process(Object param) {
         *                 return null;
         *             }
         *         }
         *
         */
        String result = huzz.execute(param -> {
            System.out.println("RUN");
            if ("TEST".equals(param)) {
                return true;
            }
            return false;
            /**
             * 可以看到中间函数execute()执行过程中,调用执行了回调函数process()
             * 看似类似普通函数中的简单调用, 但回调函数却有着很大的灵活性,
             * 如下 再调用中间函数实现一些不同的行为试试
             *
             */
        });
        /**
         * 回调函数实现不同的行为
         */
        huzz.execute(new CallbackInterface() {
            @Override
            public boolean process(String param) {
                if (param.length() == 4) {
                    return true;
                }
                return false;
            }
        });
        
    }
经验分享 程序员 微信小程序 职场和发展