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 组件开发中更常用的工具类。

相关推荐
三品吉他手会点灯11 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法
疯狂打码的少年11 小时前
中断处理过程与中断优先级
笔记
心之伊始11 小时前
Java 后端接入大模型:从 Token、并发到推理成本的完整估算方法
java·spring boot·性能优化·大模型·llm
likerhood11 小时前
WSL 下安装 Miniconda 笔记
笔记·wsl
BlackTurn11 小时前
技术经理投标
java
YG亲测源码屋12 小时前
java配置环境变量、jdk环境变量配置、java环境变量设置方法
java·开发语言
MIUMIUKK12 小时前
从语法层面,看懂 Python 的特殊处
java·开发语言·python
hujinyuan2016012 小时前
2026年3月 中国电子学会青少年软件编程(Python)三级考试试卷 真题及答案
java·python·算法
basketball61612 小时前
C++ 高级编程:2. 基本线程池实现
java·开发语言·c++
MageGojo13 小时前
天气 API 接入实战:基于 ApiZero 实现实时天气、分钟级降水和 15 天预报查询
java·后端·spring·api 接口接入·接口实战