【對線面試官】 Java 泛型

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

    List<T> findAll();

    List<T> findAll(Sort sort);

    List<T> findAllById(Iterable<ID> ids);

    <S extends T> List<S> saveAll(Iterable<S> entities);

    void flush();

    <S extends T> S saveAndFlush(S entity);

    void deleteInBatch(Iterable<T> entities);

    void deleteAllInBatch();

    T getOne(ID id);

    @Override
    <S extends T> List<S> findAll(Example<S> example);

    @Override
    <S extends T> List<S> findAll(Example<S> example, Sort sort);
}

// 傳入 須要group by 和 sum 的字段名
public cacheMap(List<String> groupByKeys, List<String> sumValues) {
  this.groupByKeys = groupByKeys;
  this.sumValues = sumValues;
}

private void excute(T e) {
  
  // 從pojo 取出須要group by 的字段 list
  List<Object> key = buildPrimaryKey(e);
  
  // primaryMap 是存儲結果的Map
  T value = primaryMap.get(key);
  
  // 若是從存儲結果找到有相應記錄
  if (value != null) {
    for (String elem : sumValues) {
      // 反射獲取對應的字段,作累加處理
      Field field = getDeclaredField(elem, e);
      if (field.get(e) instanceof Integer) {
        field.set(value, (Integer) field.get(e) + (Integer) field.get(value));
      } else if (field.get(e) instanceof Long) {
        field.set(value, (Long) field.get(e) + (Long) field.get(value));
      } else {
        throw new RuntimeException("類型異常,請處理異常");
      }
    }
    
    // 處理時間記錄
    Field field = getDeclaredField("updated", value);
    if (null != field) {
      field.set(value, DateTimeUtils.getCurrentTime());
    }
  } else {
    // group by 字段 第一次進來
    try {
      primaryMap.put(key, Tclone(e));
      createdMap.put(key, DateTimeUtils.getCurrentTime());
    }catch (Exception ex) {
      log.info("first put value error {}" , e);
    }
  }
}

文章以純面試的角度去講解,因此有不少的細節是未鋪墊的。java

好比說反射和泛型基礎,這些在【Java3y】都有過詳細的基本教程甚至電子書,我就再也不詳述了。面試

歡迎關注個人微信公衆號【面試造火箭】來聊聊Java面試微信

相關文章
相關標籤/搜索