Cache
Guava的Cache封装的功能比较全面,但是很多地方和设想的不太一样,最明显的就是RemovalListener,它并不是invalid之后就会被调用,因为在调用Cache的invalid的时候,其实并没有真正从内存中删除,只是标记为删除而已,需要通过调用clear或者手工获取的时候,才会进行删除。所以这就要求你在使用的时候要自己实现线程去定时调用clear,或者在需要的时候调用clear,来进行调用。
之所以Cache内部没有实现物理删除是因为需要添加添加一个线程,这个线程可能会和用户主线程争抢资源,所以线程这个事就交给了外部用户程序去实现。其实Cache更多的应用场景是默默的删除,但是我现在开发的项目,其实是希望能够捕获过期删除这个事件(定时删除过期任务,过期的任务要归档),才会有个纠结。
另外,Cache的get可以指定一个Callable,不存在就加载并放置到内存中,Callable则是加载的逻辑;而getIfPresent则是不存在返回空,比较符合传统的get语意;
Lists/Maps集合类处理
Guava里面的Lists的神奇,我之前一直不太理解有什么用,今天终于发现确实很省劲,比如:
List<Map<String, String>> ret = Lists.newArrayList();
如果按照java普通写法,还要new 一个ArrayList<Map<String.String>>,要敲半天泛型的类型;但是采用Lists.newXX的方法可以十分省劲的完成了泛型的指定。