List懶加載(批量模式)

/**
*    繼承自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();
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章