大学生学习记录。佬可滑走。
核心一句话
函数式编程 = 把【代码逻辑/行为】当作参数传递 在项目中缓存模板可使用到:
- 固定流程:查redis - 不存在 - 查数据- 存 Redis
- 可变逻辑:查数据的具体逻辑(查活动配置,查商品信息等) 把可变逻辑写成函数传进去,就是函数式编程。
函数式接口 作用:被lambda表达式实现
@FunctionalInterface // `@FunctionalInterface` = **我是函数式接口,只能有 1 个抽象方法**
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
核心价值:行为参数化 数据当参数 -> 普通编程 逻辑当参数 -> 函数式编程。
java 4大核心函数式接口
| 接口 | 抽象方法 | 作用 | 你的业务场景 |
|---|---|---|---|
| Supplier 供给型 | T get() | 无参,返回数据 | 查数据、生成数据(你缓存模板用这个!) |
| Function<T,R> 函数型 | R apply(T) | 入参 T,返 R | 数据转换、处理 |
| Consumer 消费型 | void accept(T) | 入参,无返回 | 存 Redis、打印、发送消息 |
| Predicate 断言型 | boolean test(T) | 入参,返布尔 | 判断、过滤、校验 |
项目实战
完整代码(SpringBoot + RedisTemplate,直接复制用)
java 运行 import org.springframework.data.redis.core.RedisTemplate; import java.util.concurrent.TimeUnit; import java.util.function.Supplier;
@Service public class CacheTemplateService {
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* 通用缓存模板(函数式编程核心)
* @param key Redis键
* @param timeout 过期时间
* @param supplier 函数:查询数据的逻辑(可变部分)
* @return 数据
*/
public <T> T getCacheData(String key, long timeout, TimeUnit unit, Supplier<T> supplier) {
// 1. 先查Redis
T cacheData = (T) redisTemplate.opsForValue().get(key);
if (cacheData != null) {
return cacheData;
}
// 2. Redis不存在 → 执行【函数】查询数据(核心!)
T dbData = supplier.get();
if (dbData == null) {
return null;
}
// 3. 存入Redis
redisTemplate.opsForValue().set(key, dbData, timeout, unit);
return dbData;
}
} ✅ 业务使用(查订单 / 查商品,随便传函数) java 运行 @Service public class OrderService { @Resource private CacheTemplateService cacheTemplate; @Resource private OrderMapper orderMapper;
public Order getOrderById(Long orderId) {
String key = "order:info:" + orderId;
// 传入【查询订单的函数】 → 函数式编程!
return cacheTemplate.getCacheData(key, 5, TimeUnit.MINUTES,
// Lambda实现Supplier:无参,返回订单数据
() -> orderMapper.selectById(orderId)
);
}
public Product getProductById(Long productId) {
String key = "product:info:" + productId;
// 传入【查询商品的函数】
return cacheTemplate.getCacheData(key, 10, TimeUnit.MINUTES,
() -> productMapper.selectById(productId)
);
}
}
Supplier 就是 “查数据的逻辑” 缓存模板完全不用关心查什么,只负责流程