函数式编程

4 阅读2分钟

大学生学习记录。佬可滑走。

核心一句话

函数式编程 = 把【代码逻辑/行为】当作参数传递 在项目中缓存模板可使用到:

  • 固定流程:查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 就是 “查数据的逻辑” 缓存模板完全不用关心查什么,只负责流程