假设,我有一个固定数量的集合(例如3个ArrayList)作为一个类的成员。现在,我想将所有元素公开给其他类,这样它们就可以简单地迭代所有元素(理想情况下为只读)。
我正在使用guava collections,我想知道如何使用guava iterables/迭代器来生成内部集合的逻辑视图,而不必制作临时副本
使用番石榴,您可以使用Iterables.concat(Iterable<;T>;…),它会创建所有Iterables的实时视图,并将其连接成一个视图(如果更改Iterables,连接的版本也会更改)。然后用Iterables.unmodifiableIterable(iterable<;T>;)包装连接的iterable(我之前没有看到只读要求)
从Iterables.concat(..)JavaDocs:
将多个ITerable组合成一个
单一的可复制的。返回的数据是不可接受的
有一个遍历
输入中每个iterable的元素。
未轮询输入迭代器
直到有必要为止。返回
iterable的迭代器支持remove()
当相应的输入迭代器
支持它
虽然这并没有明确表示这是一个实时视图,但最后一句暗示它是(仅当支持迭代器的迭代器支持时才支持Iterator.remove()方法,除非使用实时视图)
示例代码:
最终列表<;整数>;first=Lists.newArrayList(1,2,3);
最终名单<;整数>;第二个=Lists.newArrayList(4,5,6);
最终名单<;整数>;第三个=Lists.newArrayList(7,8,9);
最终可测试性<;整数>;全部=
不可修改的(
第一,第二,第三);
系统输出打印项次(全部);
第三,增加(9999999);
系统输出打印项次(全部);
输出:
[1,2,3,4,5,6,7,8,9]
[1,2,3,4,5,6,7,8,999999]
编辑:
根据Damian的请求,这里有一个类似的方法返回一个实时集合视图
公共最终类集合X{
静态类JoinedCollectionView<;E>;实现收集<;E>{
私人最终收藏<;?扩展E>;[]项;
公共联合收藏视图(最终收藏<;?扩展E>;[]项){
这个项目=项目;
}
@凌驾
公共布尔addAll(最终集合<;?扩展E>;c){
抛出新的UnsupportedOperationException();
}
@凌驾
公共空间清除(){
对于(最终收集<;?扩展E>;coll:项目){
coll.clear();
}
}
@凌驾
公共布尔包含(最终对象o){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔容器所有(最终集合<;?>;c){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔值为空(){
return!迭代器().hasNext();
}
@凌驾
公共迭代器<;E>;迭代器(){
返回Iterables.concat(items.iterator();
}
@凌驾
公共布尔删除(最终对象o){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔removeAll(最终集合<;?>;c){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔保留(最终集合<;?>;c){
抛出新的UnsupportedOperationException();
}
@凌驾
公共整数大小(){
int-ct=0;
对于(最终收集<;?扩展E>;coll:项目){
ct+=coll.size();
}
返回ct;
}
@凌驾
公共对象[]toArray(){
抛出新的UnsupportedOperationException();
}
@凌驾
公共<;T>;T[]到阵列(T[]a){
抛出新的UnsupportedOperationException();
}
@凌驾
公共布尔加法(E){
抛出新的UnsupportedOperationException();
}
}
/**
*返回传入集合的实时聚合集合视图。
*<;p>;
*除了{@link Collection#size()}、{@link Collection#clear()}之外的所有方法,
*{@link Collection#isEmpty()}和{@link Iterable#iterator()}
*在返回的集合中抛出{@link UnsupportedOperationException}。
*<;p>;
*上述方法都不是线程安全的(也没有简单的方法)
*(制作它们的方法)。
*/
公共静态<;T>;收集<;T>;联合收割机(
最终收集(扩展项){
返回新的JoinedCollectionView<;T>;(项目);
}
私人收藏X(){
}
}