您可以扩展 AbstractList (或您正在使用的任何抽象类型的集合)
在这个抽象中,您可以在构造函数中获取源集合并持有对它的引用以及原始列表的视图的起点和终点
覆盖 add/remove/set 方法,以便这些操作也在源集合上执行。
IE
class ListView<T> extends AbstractList<T> {
int start = 0;
int end = 0;
private Collection<T> original = null;
public ListView(List<T> original, int start, int end) {
this.original = original;
this.start = start;
this.end = end;
super.addAll(0, original.subList(start, end));
}
// Any add/set/remove must also alter the original
}
ListView 实际上应该是原始列表的代理。
或者,通过更多的工作,您可以实现 Collection 或 List 接口,以便您以类似的方式直接处理原始列表
然后,您可以调用您的方法或传递 ListView,就像普通集合一样。
IE
public void doSomeWork(Collection<String> collection);
...
object.doSomeWork(new ListView<String>(original, 0, 2));