跳至主要内容

Java 通用缓存类简单实现

Java 通用缓存类简单实现

使用方法

很简单,两行代码搞定。

DataCache<Object> dataCache =
   new DataCache<>(() -> mDao.getAll());
List<Object> =  dataCache.getData()

其中() -> mDao.getAll()是超时的时候自动调用的接口。

假设你之前获取数据的方法是 getData() ,
那上述代码就应该改成 () -> getData()

最后使用 dataCache.getData() 获取数据即可。

代码简单实现

  /**
     * 使用方法示例
     * 初始化
     * DataCache<Object> dataCache = new DataCache<>(() -> mDao.getAll());
     * 读取缓存
     * List<Object> =  dataCache.getData()
     * 如果你有多个缓存,你可以考虑使用 Map 结构来存储
     * Map<String, DataCache<Object>> cacheMap = new HashMap<>();
     *
     * @param <T> 数据类型
     * @author Zmaplex
     * @version 0.1
     */
    public class DataCache<T> {
        /**
         * 超时时间,单位秒
         * 可以使用如下构造器,设置超时时间
         * DataCache(DataCacheCall<T> dataCacheCall, int outTime)
         */
        private int outTime = 100;
        /**
         * 最后修改时间。
         * 每次读取数据的时候,自动更新这个字段。
         */
        private long lastModify = 0;
        /**
         * 通用数据列表,用作缓存
         */
        private List<T> data = new ArrayList<>();
        /**
         * 数据缓存回调接口
         * 当超时的时候,将自动调用 onCallUpdate 更新 data 数据。
         */
        private DataCacheCall<T> dataCacheCall;

        /**
         * 构造器
         *
         * @param dataCacheCall 数据缓存回调
         */
        public DataCache(DataCacheCall<T> dataCacheCall) {
            this.dataCacheCall = dataCacheCall;
        }

        /**
         * 构造器
         *
         * @param dataCacheCall 数据缓存回调
         * @param outTime       超时时间,单位秒
         */
        public DataCache(DataCacheCall<T> dataCacheCall, int outTime) {
            this.dataCacheCall = dataCacheCall;
            this.outTime = outTime;
        }

        /**
         * 返回缓存数据
         * 超时的时候会自动调用回调接口更新数据
         *
         * @return 返回列表数据
         */

        public List<T> getData() {
            long during = (System.currentTimeMillis() - lastModify) / 1000;
            if (during > outTime) {
                data = dataCacheCall.onCallUpdate();
            }
            lastModify = System.currentTimeMillis();
            return data;
        }

        /**
         * @param <T> 泛型
         */
        private interface DataCacheCall<T> {
            List<T> onCallUpdate();
        }
    }

评论

此博客中的热门博文

Lambda can be replaced with method reference

Lambda can be replaced with method referenceAndroid开发的时候提示 Lambda can be replaced with method reference只需要按下 Alt + Enter 即可效果如下参考资料How to change Runnable to lambda expression in Java with IntelliJ shortcut

ffmpeg 音频淡出淡出并调整音量

ffmpeg 音频淡出淡出并调整音量1 淡出淡入ffmpeg -i 青花瓷.aac -filter_complex "[0:a]afade=t=in:ss=0:d=5[a1]; [a1]afade=t=out:st=60:d=5[a2]; [a2]volume=0.1" t.mp3 青花瓷.aac 是第0个输入文件
[0:a] 代表是处理第0个输入文件的(Audio)音频文件[0:a]afade=t=in:ss=0:d=5[a1] 处理 [0:a] 资源从第 0 秒开始淡入,持续5秒 ,并标记这个过滤器名为 [a1]
过滤器名字可以随便取,但要符合命名规范,请自行查询 ffmpeg 过滤器命令规范。[a1]afade=t=out:st=60:d=5[a2] 处理 [a1] 的资源,从第60秒开始淡出,持续5秒。注意:淡出结束后,后面的音频将全部静音[a2]volume=0.1 2 处理音频处理 [a2] 资源的音量,为原来的 0.1 倍音量。t.mp3 为输出的音频

ffmpeg-filter 使用指南

ffmpeg-filter 使用指南说明只是一份备份。查看原文作者:hguoFilter 思想filter 架构思想中第一个概念是 Graph,一般翻译为画布,如果 Graph 看做是桌子的话,那 filters 们就是桌子上的“悲剧”。所以先要有 Graph,然后再将 filter 摆在上面, filter是身上有 pin 接口, pin 的作用是统一数据接口,然后还需要一个 link 的动作, link 的作用是将指定的 2 个 filter 通过其 pin 接口连接起来,这样就形成了一个完整的 filter graph或是叫 filter link list。List item如果只有 filter graph 的存在,它只是一堆参数数据和代码,并不能运行,需要一个动力泵或是动力引擎将整个过程驱动起来,这就像人还缺一颗心脏一样,那人的血液就是filter graph 的数据流。这样 FFmpeg 就把驱动的能力交给了 filter 框架外面来做,通过向 filter graph 的首个 filter 推数据和从 filter graph 的末尾 filter 拉数据从而驱动整个 filter graph 的数据流动。命令行使用命令ffmpeg -i file_copy.ts -i logo.png -filter_complex " [1:v]scale=100:100[logo]; [0:v][logo]overlay=x=main_w-100:y=main_h-100" output.mp4 参数简记-filter_complex:滤镜必选参数,后面跟滤镜命令[1:v] :输入pin,表示视频的第1路scale=100:100 :对[1:v]输入pin的处理,缩放成100:100[logo] :输出pin; 每个滤镜分割0:v :两个输入,第一个视频,上一个滤镜的输出overlay=x=main_w-100:y=main_h-100 :滤镜动作