当前位置: 首页 > news >正文

Java Functional Interface 函数式接口

函数式接口的作用和优点

函数式接口的作用

函数式接口(Functional Interface)是Java 8引入的核心概念之一,主要作用包括:

  1. 支持Lambda表达式:函数式接口是Lambda表达式的目标类型,使得可以用更简洁的方式表示匿名内部类
  2. 行为参数化:可以将方法作为参数传递,实现更灵活的代码结构
  3. 函数式编程基础:为Java引入函数式编程范式提供基础支持
  4. 简化回调机制:替代传统的匿名内部类实现回调

函数式接口的优点

  1. 代码简洁性:
    相比匿名内部类,Lambda表达式大幅减少样板代码
    示例:(a, b) -> a + b 替代了多行的匿名类实现
  2. 可读性增强:
    更直观地表达意图,特别是对于简单的操作
    减少不必要的类和方法声明
  3. 并行处理支持:
    与Stream API结合,便于实现并行操作
    示例:list.parallelStream().map(x -> x*2).collect(…)
  4. 组合性:
    可以通过方法引用和组合操作构建复杂行为
    示例:andThen()、compose()等方法组合多个函数
  5. 延迟执行:
    Lambda表达式可以延迟到需要时才执行
    示例:Supplier接口的get()方法
  6. 内置常用接口:
    Java提供了java.util.function包,包含40多个常用函数式接口
    如Predicate、Function、Consumer、Supplier等

常见函数式接口示例

接口方法签名用途描述
Supplier<泛型>T get()无参数,返回一个结果(生产者)
Consumer<泛型>void accept(T t)接收一个参数,无返回值(消费者)
BiConsumer<T, U>void accept(T t, U u)接收两个参数,无返回值
Function<T, R>R apply(T t)接收一个参数,返回结果(映射)
BiFunction<T, U, R>R apply(T t, U u)接收两个参数,返回结果
Predicate<泛型>boolean test(T t)接收一个参数,返回布尔值(断言)
BiPredicate<T, U>boolean test(T t, U u)接收两个参数,返回布尔值

应用场景之封装Redisson分布式锁自动加锁和释放锁公共方法

定义一个函数式接口

/**
 * 定义业务函数式接口
 */
@FunctionalInterface
public interface LogicFunction {
    
    /**
     * 业务逻辑
     */
    void execute();

}

定义一个工具类

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

/**
 * Redisson工具类
 */
public final class RedissonUtils {
    //私有构造函数
    private RedissonUtils() {}

    //参数校验
    private static void notNull(Object object, String message) {
        if (object == null) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 自动加锁和释放锁公共方法
     *
     * @param redisson RedissonClient
     * @param lockName 分布式锁的名称
     * @param logicFunction 业务逻辑函数
     * @return 是否加锁成功
     */
    public static boolean lock(RedissonClient redisson, String lockName, LogicFunction logicFunction) {
        // 参数校验
        notNull(redisson, "redisson must not be null");
        notNull(lockName, "lockName must not be null");
        notNull(logicFunction, "LogicFunction must not be null");

        RLock lock = redisson.getLock(lockName);
        boolean tryLock = lock.tryLock();

        //没有获取到锁,直接返回
        if (!tryLock) {
            return false;
        }

        try {
            //业务逻辑
            logicFunction.execute();
            return true;
        } catch (Exception e) {
            // 直接抛出原始异常(RuntimeException)
            throw (RuntimeException) e;
        } finally {
            // 安全释放锁(避免在锁已自动释放时抛出IllegalMonitorStateException)
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }

}

调用

	//依赖注入
    private final RedissonClient redisson;
    
	public void subProductLock() {
        boolean lock = RedissonUtils.lock(redisson, "subProductLock", () -> {
            //业务逻辑
            return;
        });
        if (!lock) {
        	//获取锁失败的处理逻辑
        }
    }

相关文章:

  • 大文件断点续传
  • 011_异常、泛型和集合框架
  • 大数据(5)(基础概念)Spark从入门到实战:核心原理与大数据处理实战案例
  • 【算法】前缀和(下)
  • 【Django】教程-12-柱状图
  • 5.JVM-G1垃圾回收器
  • 顺序栈简记
  • 为什么选择Redis?解析核心使用场景与性能优化技巧
  • QML面试笔记--UI设计篇02布局控件
  • 山东大学计算机网络第五章习题解析
  • 虚拟表、TDgpt、JDBC 异步写入…TDengine 3.3.6.0 版本 8 大升级亮点
  • 数字电子技术基础(四十)——使用Digital软件和Multisim软件模拟显示译码器
  • PyTorch 生态迎来新成员:SGLang 高效推理引擎解析
  • JMeterPlugins-Standard-1.4.0 插件详解:安装、功能与使用指南
  • “拈彩”测试报告
  • 【力扣刷题实战】全排列II
  • JavaScript惰性加载优化实例
  • day22 学习笔记
  • 算法卷一:起行
  • 深入剖析C语言中的指针与数组
  • 陕西网站开发价格/优帮云排名优化
  • 北京简约网站建设公司/seo推广视频隐迅推专业
  • WordPress修改首页文章预览/seo是如何优化
  • 有需求或做任务赚钱的网站么/网站设计的流程
  • 寿光做网站的公司/如何推广网址链接
  • 家具网站php源码/银川网页设计公司