What
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
参数解析
Function <T,R>
接受一个参数T, 返回一个参数R(给我一个t, 返回一个r)
apply函数
如果执行apply函数, 就是把给定的函数执行下
How
这里使用一个工具类,用于从缓存数据
/**
* @param key redis的key
* @param expireTime 过期时间
* @param queryFunction 数据库查询函数
* @param parseStringToObject 将redis中的string数据转为对象
* @param parseObjectToString 将对象转为string
* @param <T>
* @return
*/
public <T> T getStringData(String key, long expireTime
, Function<String, T> queryFunction
, Function<String, T> parseStringToObject
, Function<T, String> parseObjectToString) {
String data = stringRedisTemplate.opsForValue().get(key);
// redis 命中
if(StringUtils.isNotEmpty(data)){
return parseStringToObject.apply(data);
}
// 这个就是从数据库查
T queryDataFromDb = queryFunction.apply(key);
if(Objects.isNull(queryDataFromDb)){
//数据库也没有
return null;
}
try {
String value = parseObjectToString.apply(queryDataFromDb);
stringRedisTemplate.opsForValue().set(key,value,expireTime, TimeUnit.SECONDS);
} catch (Exception e){
log.error("序列化失败",e);
}
return queryDataFromDb;
}
调用方如下
public List<SearchFactorFormulaEntity> getFormulaList() {
return redisTemplateUtils.getStringData("search_formula_list",3600L, s -> searchFactorFormulaMapper.selectList(null),
s1->{
List<SearchFactorFormulaEntity> formulaEntityList = null;
ObjectMapper objectMapper = new ObjectMapper();
try {
formulaEntityList = objectMapper.readValue(s1, new TypeReference<List<SearchFactorFormulaEntity>>() {});
} catch (JsonProcessingException e) {
log.error("jackson反序列化异常,message",e);
}
return formulaEntityList;
},
c -> {
String formulaEntityListStr = null;
ObjectMapper objectMapper = new ObjectMapper();
try {
formulaEntityListStr = objectMapper.writeValueAsString(c);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
log.info("DB命中 内容为{}",formulaEntityListStr);
return formulaEntityListStr;
});
}
参数解析
查询DB 函数 Function<String, T>
形参
Function<String, T> queryFunction
传入 String s
返回 T t
实际参数
s-> searchFactorFormulaMapper.selectList(null)
转换为匿名内部类如下
这样看起来简单些, 传入一个字符串s, 返回一个List集合
new Function<String, List<SearchFactorFormulaEntity>>() {
@Override
public List<SearchFactorFormulaEntity> apply(String s) {
return searchFactorFormulaMapper.selectList(null);
}
}
List对象转字符串 Function<T, String>
形参
Function<T, String> parseObjectToString
输入 T t
返回 String s
实际参数
c -> {
String formulaEntityListStr = null;
ObjectMapper objectMapper = new ObjectMapper();
try {
formulaEntityListStr = objectMapper.writeValueAsString(c);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
log.info("DB命中 内容为{}",formulaEntityListStr);
return formulaEntityListStr;
})