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) {
        	//抛给调用方并输出错误日志,方便排查问题。
            log.error("{}异常:{}", lockName, e.getMessage(), e);
            throw e;
        } finally {
            // 安全释放锁(避免在锁已自动释放时抛出IllegalMonitorStateException)
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }

}

调用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值