原文地址:http://www.xx566.com/detail/176.html
上一篇,Guava库学习:学习Guava Cache(四)CacheBuilderSpec 中, 我们简单的学习了使用CacheBuilderSpec类构造CacheBuilder实例,在之前的CacheBuilder学习中,我们注意到了 build方法里面传入的CacheLoader,简单的做了一些了解,不过其中仍有一些方法我们没有涉及,本篇,我们就来研究和学习一下 CacheLoader。
CacheLoader是一个抽象类,因为其中的load方法是一个抽象方法,翻看源码,其中也提供了一个loadAll方法,用于接收一个 Iterable对象,loadAll方法代表加载所有包含在传入Iterable中的缓存条目(除非我们覆盖loadAll方 法),CacheLoader中提供了两个静态方法,能够使我们利用之前Guava函数式编程中学习到的一些工具类,如Function、Supplier。
第一个方法接收一个Function对象,用于进行对象传入到传出的转换(更多Funciton,参见【Guava库学习:函数编程(一)使用Function和Functions进行对象转换】):
CacheLoader<Key,value> cacheLoader =
CacheLoader.from(Function<Key,Value> func);
当Function对象作为CacheLoader.from方法的参数时,我们可以获取到返回的CacheLoader实例,key为传入的对象,value为key经过Function转换后的值,下面是一个简单的示例:
@Test
public void testCacheLoaderFunction() throws Exception {
Function<Date, String> function = new Function<Date, String>() {
@Override
public String apply(Date input) {
return new SimpleDateFormat("yyyy-MM-dd").format(input);
}
};
CacheLoader<Date, String> cacheLoader = CacheLoader.from(function);
assertThat(cacheLoader.load(new Date()), is("2014-12-06"));
}
与之类似的,CacheLoader.from方法也可以接收一个Supplier,进行对象的包装构建(更多Supplier,参见【Guava库学习:函数编程(三)使用Supplier和Suppliers进行对象的包装构建】):
CacheLoader<Object,Value> cacheLoader =
CacheLoader.from(Supplier<Value> supplier);
上面的方法,我们通过一个Supplier方法构建了一个CacheLoader实例,值得注意的是,任意传递给CacheLoader的键,都会导致Supplier的get方法被调用。下面是一个简单的示例:
@Test
public void testCacheLoaderSupplier() throws Exception {
Supplier<Long> supplier = new Supplier<Long>() {
@Override
public Long get() {
//这里简单的返回时间戳
return System.currentTimeMillis();
}
};
CacheLoader<Object, Long> cacheLoader = CacheLoader.from(supplier);
System.out.println(cacheLoader.load("first"));
Thread.sleep(300);//这里线程休息下,方便测试
System.out.println(cacheLoader.load("second"));
}
代码地址:http://git.oschina.net/realfighter/xx566-diary/blob/master/src/guava/CacheLoaderTest.java