Java Functional Interface 函数式接口
函数式接口的作用和优点
函数式接口的作用
函数式接口(Functional Interface)是Java 8引入的核心概念之一,主要作用包括:
- 支持Lambda表达式:函数式接口是Lambda表达式的目标类型,使得可以用更简洁的方式表示匿名内部类
- 行为参数化:可以将方法作为参数传递,实现更灵活的代码结构
- 函数式编程基础:为Java引入函数式编程范式提供基础支持
- 简化回调机制:替代传统的匿名内部类实现回调
函数式接口的优点
- 代码简洁性:
相比匿名内部类,Lambda表达式大幅减少样板代码
示例:(a, b) -> a + b 替代了多行的匿名类实现 - 可读性增强:
更直观地表达意图,特别是对于简单的操作
减少不必要的类和方法声明 - 并行处理支持:
与Stream API结合,便于实现并行操作
示例:list.parallelStream().map(x -> x*2).collect(…) - 组合性:
可以通过方法引用和组合操作构建复杂行为
示例:andThen()、compose()等方法组合多个函数 - 延迟执行:
Lambda表达式可以延迟到需要时才执行
示例:Supplier接口的get()方法 - 内置常用接口:
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) {
//获取锁失败的处理逻辑
}
}