Java Swing 自定义组件库分享(二)

Java Swing 自定义组件库分享(二):回调函数处理器 --- CallbackProcessor

一、这个类解决什么问题?

在 Swing 开发中,经常需要传回调函数,比如按钮点击事件、窗口关闭事件、异步任务完成后的处理。

原来写法经常是这样:

java 复制代码
if (null != callback) {
    callback.run();
}

到处写判空,代码臃肿且重复。

CallbackProcessor 的作用就是:封装判空逻辑,让代码更简洁。

二、类源码

java 复制代码
/**
 * 回调函数处理器
 * 封装各种函数式接口的判空调用,简化代码
 * 
 * 使用示例:
 * 1. 执行可能为null的Runnable:
 *    CallbackProcessor.run(() -> doSomething());
 * 2. 获取返回值并带默认值:
 *    String result = CallbackProcessor.get(() -> getData(), "默认值");
 * 3. 条件判断:
 *    boolean valid = CallbackProcessor.test(value -> value > 0, 10);
 */
public class CallbackProcessor {

    /**
     * 执行无参无返回值的回调
     * @param callback 回调函数,可为null
     */
    public static void run(Runnable callback) {
        if (null != callback) {
            callback.run();
        }
    }

    /**
     * 执行带一个参数的回调
     * @param callback 回调函数,可为null
     * @param t 参数
     * @param <T> 参数类型
     */
    public static <T> void accept(Consumer<T> callback, T t) {
        if (null != callback) {
            callback.accept(t);
        }
    }

    /**
     * 执行带两个参数的回调
     * @param callback 回调函数,可为null
     * @param t 第一个参数
     * @param u 第二个参数
     */
    public static <T, U> void accept(BiConsumer<T, U> callback, T t, U u) {
        if (null != callback) {
            callback.accept(t, u);
        }
    }

    /**
     * 获取供给值,返回Optional包装
     * @param callback 供给函数,可为null
     * @return Optional包装的结果,回调为null时返回Optional.empty()
     */
    public static <R> Optional<R> get(Supplier<R> callback) {
        return null != callback ? Optional.ofNullable(callback.get()) : Optional.empty();
    }

    /**
     * 获取供给值,带默认值
     * @param callback 供给函数,可为null
     * @param defaultValue 回调为null或返回null时的默认值
     * @return 供给值或默认值
     */
    public static <R> R get(Supplier<R> callback, R defaultValue) {
        return null != callback ? callback.get() : defaultValue;
    }

    /**
     * 执行转换函数,返回Optional包装
     * @param callback 转换函数,可为null
     * @param t 输入参数
     * @return Optional包装的结果,回调为null时返回Optional.empty()
     */
    public static <T, R> Optional<R> apply(Function<T, R> callback, T t) {
        return null != callback ? Optional.ofNullable(callback.apply(t)) : Optional.empty();
    }

    /**
     * 执行转换函数,带默认值
     * @param callback 转换函数,可为null
     * @param t 输入参数
     * @param defaultValue 回调为null或返回null时的默认值
     * @return 转换结果或默认值
     */
    public static <T, R> R apply(Function<T, R> callback, T t, R defaultValue) {
        return null != callback ? callback.apply(t) : defaultValue;
    }

    /**
     * 执行双参数转换函数,返回Optional包装
     * @param callback 转换函数,可为null
     * @param t 第一个参数
     * @param u 第二个参数
     * @return Optional包装的结果,回调为null时返回Optional.empty()
     */
    public static <T, U, R> Optional<R> apply(BiFunction<T, U, R> callback, T t, U u) {
        return null != callback ? Optional.ofNullable(callback.apply(t, u)) : Optional.empty();
    }

    /**
     * 执行双参数转换函数,带默认值
     * @param callback 转换函数,可为null
     * @param t 第一个参数
     * @param u 第二个参数
     * @param defaultValue 回调为null或返回null时的默认值
     * @return 转换结果或默认值
     */
    public static <T, U, R> R apply(BiFunction<T, U, R> callback, T t, U u, R defaultValue) {
        return null != callback ? callback.apply(t, u) : defaultValue;
    }

    /**
     * 执行一元运算,返回Optional包装
     * @param callback 一元运算函数,可为null
     * @param t 输入参数
     * @return Optional包装的结果,回调为null时返回Optional.empty()
     */
    public static <T> Optional<T> apply(UnaryOperator<T> callback, T t) {
        return null != callback ? Optional.ofNullable(callback.apply(t)) : Optional.empty();
    }

    /**
     * 执行一元运算,带默认值
     * @param callback 一元运算函数,可为null
     * @param t 输入参数
     * @param defaultValue 回调为null或返回null时的默认值
     * @return 运算结果或默认值
     */
    public static <T> T apply(UnaryOperator<T> callback, T t, T defaultValue) {
        return null != callback ? callback.apply(t) : defaultValue;
    }

    /**
     * 执行二元运算,返回Optional包装
     * @param callback 二元运算函数,可为null
     * @param t1 第一个参数
     * @param t2 第二个参数
     * @return Optional包装的结果,回调为null时返回Optional.empty()
     */
    public static <T> Optional<T> apply(BinaryOperator<T> callback, T t1, T t2) {
        return null != callback ? Optional.ofNullable(callback.apply(t1, t2)) : Optional.empty();
    }

    /**
     * 执行二元运算,带默认值
     * @param callback 二元运算函数,可为null
     * @param t1 第一个参数
     * @param t2 第二个参数
     * @param defaultValue 回调为null或返回null时的默认值
     * @return 运算结果或默认值
     */
    public static <T> T apply(BinaryOperator<T> callback, T t1, T t2, T defaultValue) {
        return null != callback ? callback.apply(t1, t2) : defaultValue;
    }

    /**
     * 执行断言判断
     * @param callback 断言函数,可为null
     * @param t 参数
     * @return 判断结果,回调为null时返回false
     */
    public static <T> boolean test(Predicate<T> callback, T t) {
        return null != callback && callback.test(t);
    }

    /**
     * 执行双参数断言判断
     * @param callback 断言函数,可为null
     * @param t 第一个参数
     * @param u 第二个参数
     * @return 判断结果,回调为null时返回false
     */
    public static <T, U> boolean test(BiPredicate<T, U> callback, T t, U u) {
        return null != callback && callback.test(t, u);
    }
}

三、核心方法说明

方法 参数类型 返回值 用途
run Runnable void 执行无参无返回值的回调
accept Consumer / BiConsumer void 执行带参数的回调
get Supplier Optional / 默认值 获取供给值,可设默认
apply Function / BiFunction / UnaryOperator / BinaryOperator Optional / 默认值 转换或计算,可设默认
test Predicate / BiPredicate boolean 条件判断,回调为 null 时返回 false

四、使用示例

4.1 执行 Runnable

java 复制代码
// 传统写法
if (action != null) {
    action.run();
}

// 用 CallbackProcessor
CallbackProcessor.run(action);

4.2 执行带参数的 Consumer

java 复制代码
// 传统写法
if (consumer != null) {
    consumer.accept(data);
}

// 用 CallbackProcessor
CallbackProcessor.accept(consumer, data);

4.3 获取返回值,带默认值

java 复制代码
// 传统写法
String result = (supplier != null) ? supplier.get() : "默认值";

// 用 CallbackProcessor
String result = CallbackProcessor.get(supplier, "默认值");

4.4 条件判断

java 复制代码
// 传统写法
boolean valid = (predicate != null) && predicate.test(value);

// 用 CallbackProcessor
boolean valid = CallbackProcessor.test(predicate, value);

五、注意事项

1、返回值带 Optional 的方法:适合链式调用,但注意 Optional 本身不能为 null

2、带默认值的方法:回调为 null 或返回 null 时,都会返回默认值

3、test 方法:回调为 null 时返回 false,不是 null 才执行判断

六、小结

CallbackProcessor 是一个简单的工具类,核心就是判空封装。

它没有复杂的技术点,但在实际项目中能减少大量重复判空代码,配合 Lambda 表达式使用体验不错。

下一篇会讲 ComponentUtils 和 FormPanelUtils,是 Swing 组件开发中更常用的工具类。

相关推荐
智慧物业老杨4 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
星空7 小时前
金蝶苍穹build.gradle配置
java·build.gradle
步行cgn9 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
大帅点兵10 小时前
Apache Ant 1.9.9 完整讲解
java
LuTshoes10 小时前
spring ai 实战 手搓 PlaneExecuteAgent
java·人工智能·spring·ai
这料鬼有毒10 小时前
二刷hot100-73.矩阵置零
java
caoerzhong10 小时前
JeeWMS 开源仓库管理系统二次开发与接口对接实战:Java WMS 如何与 ERP、MES 和自动化设备打通
java·开源
长谷深风11111 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪11 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
槑有烦恼11 小时前
Java 字符串 & List集合 高频易错真题复盘(含全部错题+修正)
java