Lambda——Function 的实践场景

668 阅读1分钟

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;

})