六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 113|回复: 0

google Collection 的MapMaker使用体验

[复制链接]

升级  88%

10

主题

10

主题

10

主题

童生

Rank: 1

积分
44
 楼主| 发表于 2013-2-5 01:31:46 | 显示全部楼层 |阅读模式
       前几天准备在写一个本地缓存的时候,有一个功能是设置超时时间,我当时用的是每次get的时候判断上次get的时间,跟当前时间对比看是否超过预期时间,来决定是否过期的。
       RednaxelaFX提示我说,可以考虑使用googleCollection的MapMaker,除了可以设置超时功能外,还可以绑定key的未取到值的function,当通过get(key)取缓存为空的时候,可以通过这个绑定的function来将返回值put到缓存中,留着下一次get。
       听完这些介绍,心动不已,找个时间,简单的test了下MapMaker,果然感觉很强大。
 
       GoogleCollection的下载地址:http://code.google.com/p/google-collections/       
 
       下面是我的测试代码。
 
 
import java.util.concurrent.ConcurrentMap;import java.util.concurrent.TimeUnit;import com.google.common.base.Function;import com.google.common.collect.MapMaker;/** * @author guoliang created GoogleColTestMain.java * @since 2010-4-28 下午05:48:55 */public class GoogleColTestMain {    /**     * @param args     */    public static void main(String[] args) {    /**     * softKeys     * weakValues     * 可以设置key跟value的strong,soft,weak属性。不错不错。     * expiration(3, TimeUnit.SECONDS)设置超时时间为3秒     *      */        ConcurrentMap<String, String> testMap = new MapMaker().concurrencyLevel(32).softKeys().weakValues().expiration(                3, TimeUnit.SECONDS).makeComputingMap(new Function<String, String>() {            /**             * 这里就是绑定的根据key没找到value的时候触发的function,             * 可以将这里的返回值放到对应的key的value中!             * @param arg0             * @return             */            @Override            public String apply(String arg0) {                return "create:" + arg0;            }        });        testMap.put("a", "testa");        testMap.put("b", "testb");        System.out.println(testMap.get("a"));        System.out.println(testMap.get("b"));        System.out.println(testMap.get("c"));        /**         * 这里sleep4秒钟过后,         * 缓存都失效,再get就会根据绑定的function去获得value放在map中了。         */        try {            Thread.sleep(4000);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }                /**         * 看看这里的再输出,是不是就是新的值了!~         */        System.out.println(testMap.get("a"));        System.out.println(testMap.get("b"));        System.out.println(testMap.get("c"));    }}  
       感觉果然很强大!感谢开源,感谢google~~~
 
 
 
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表