使用Supplier 可以对方法做个简单封装,比如对某个方法的返回结果进行缓存
1.Supplier 原型:get表示 返回一个类型为T的的方法
@FunctionalInterface
public interface Supplier<T> {
T get();
}
2.实现
import com.alibaba.fastjson.JSON;
import com.ctrip.car.osd.util.LogHelper;
import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
public class CacheHelper {
private static final int EXPIREDSECOND = 60 * 10;//10 MINUTES
/**
*
* @param key 缓存key
* @param supplier 需缓存结果的方法
* @param classz 缓存数据的类型
* @param <T>
* @return
*/
public static <T> List<T> getOrSetData(String key, Supplier<List<T>> supplier, Class classz) {
List<T> list;
try {
//修改成自己的缓存实现
//存在缓存则使用fastjson对缓存中的数据进行转换
if (RedisManager.exists(key)) {
list = JSON.parseArray(RedisManager.get(key), classz);
} else {
//不存在缓存的则调用supplier,并且将结果存入缓存
list = supplier.get();
if (CollectionUtils.isNotEmpty(list)) {
RedisManager.set(key, JSON.toJSONString(list), EXPIREDSECOND);
}
}
} catch (Exception ex) {
LogHelper.error("CacheHelper.getOrSetData", ex);
list = new ArrayList<>();
}
return list;
}
}
3.使用例子
List<DataType> allList = CacheHelper.getOrSetData(CACHE_KEY, () -> getAllData(), Advertisement.class);
/*
//getAllData原型
List<Advertisement> getAllData() ;
*/