Guava Cache 通过 Lambda 简化加载逻辑:可用 CacheLoader.from() 替代匿名类,支持方法引用;普通 Cache 的 get(K, Callable) 也兼容 Lambda 实现按需加载;refreshAfterWrite 配合 Lambda 可模拟自动刷新,异步执行且容错;结合 Optional 用 Lambda 统一处理空值。

Guava Cache 本身不直接支持“自动刷新”(refresh),但可以通过 LoadingCache 结合 Lambda 表达式,简洁实现按需加载、延迟计算和轻量级刷新逻辑。关键在于用函数式写法替代冗长的匿名内部类,让缓存构建更清晰、可读性更强。
用 Lambda 替代 CacheLoader 匿名类
传统写法需重写 load() 方法,而 Java 8+ 可直接传入 Lambda,前提是 CacheLoader 是函数式接口(它确实是)。
-
旧方式(冗长):
new CacheLoader<String, User>() { public User load(String key) { return userDao.findById(key); } } -
新方式(Lambda):
CacheLoader.from(key -> userDao.findById(key))或更简洁地:CacheLoader.from(userDao::findById)
注意:需使用 CacheLoader.from() 静态工厂方法,它接受 Function<K, V>,天然适配 Lambda 和方法引用。
在 get() 中嵌入 Lambda 实现按需加载
即使不用 LoadingCache,普通 Cache 的 get(K, Callable<V>) 方法也支持 Lambda:
cache.get("user:1001", () -> { System.out.println("DB hit"); return userDao.findById("1001"); })- 该 Callable 只在缓存未命中时执行,避免了空值判断和手动加载逻辑
- 适合一次性、非复用的加载场景,比如临时配置或兜底数据
模拟“自动刷新”的 Lambda 写法
Guava 原生不提供 refreshAfterWrite 的自动异步刷新(Caffeine 有),但可用 refreshAfterWrite + 自定义 CacheLoader 搭配 Lambda 实现近似效果:
- 启用刷新:
.refreshAfterWrite(5, TimeUnit.MINUTES) - 配合
CacheLoader使用 Lambda 加载:CacheLoader.from(key -> fetchFromDB(key)) - 注意:刷新是异步触发的,不影响主线程返回旧值;若需强一致,仍应主动调用
refresh() - 刷新失败不会影响缓存内容,也不会抛异常——这是 Guava 的默认容错策略
结合 Optional 与 Lambda 处理空值加载
当数据库查不到结果时,可统一返回 Optional.empty(),再用 Lambda 映射为默认值或抛异常:
cache.get("key", () -> Optional.ofNullable(userDao.findById("key")) .orElseThrow(() -> new UserNotFoundException("not found")))- 或返回默认对象:
.orElse(new User("guest")) - 这种组合让空值处理集中、可测试,避免散落在各处的 if-else


















