/**
* 继承自AbstractList,不支持修改操作.如果进行了remove,下面就难以通过indexOf找到对应的value了
*/
public class LazyList<K,T> extends AbstractList<T>{
private List<T> values;
LazyList(Function<List<K>, List<T>> batchLoader, List<K> keys,Class<T> clazz) {
this.values=keys.stream().map(k->(T) Proxy.newProxyInstance(clazz.getClassLoader(),
new Class[]{clazz},
(o, method, objects) -> {
var targetMethod=Stream.of(k.getClass().getMethods())
.filter(m->m.getName().equals(method.getName()))
.findAny();
if(targetMethod.isPresent()){
return ReflectionUtils.invokeMethod(targetMethod.get(),k);
}else{
-- 进行切换
values= batchLoader.apply(keys);
return ReflectionUtils.invokeMethod(method,values.get(keys.indexOf(k)));
}
})).collect(Collectors.toList());
}
@Override
public T get(int i) {
return values.get(i);
}
@Override
public int size() {
return values.size();
}
}