使用Supplier接口
Supplier接口只要一个方法:
public interface Supplier<T> {
T get();
}
非常简单的一个定义,简而言之,得到一个对象。但它有什么用呢?我们可以把耗资源运算放到get方法里,在程序里,我们传递的是Supplier对象,直到调用get方法时,运算才会执行。
实现Supplier的示例:
public class ComposedPredicateSupplier implements Supplier<Predicate<String>> {
@Override
public Predicate<String> get() {
City city = new City("Austin,TX","12345",250000, Climate.SUB_TROPICAL,45.3);
State state = new State("Texas","TX", Sets.newHashSet(city), Region.SOUTHWEST);
City city1 = new City("New York,NY","12345",2000000,Climate.TEMPERATE,48.7);
State state1 = new State("New York","NY",Sets.newHashSet(city1),Region.NORTHEAST);
Map<String,State> stateMap = Maps.newHashMap();
stateMap.put(state.getCode(),state);
stateMap.put(state1.getCode(),state1);
Function<String,State> mf = Functions.forMap(stateMap);
return Predicates.compose(new RegionPredicate(), mf);
}
}
- 使用Suppliers.memoize
memoize() 函数第一次 get() 的时候,它会调用真正Supplier,得到结果并保存下来,下次再访问就返回这个保存下来的值。
Supplier<Predicate<String>> wrapped = Suppliers.memoize(composedPredicateSupplier);
- 使用Suppliers.memoizeWithExpiration
有时候,这个值只在一段时间内是有效的,让我们可以设定过期时间:
Supplier<Predicate<String>> wrapped = Suppliers.memoize(composedPredicateSupplier,10L,TimeUnit.MINUTES);
PS:函数式编程里的惰性求值