将多个集合合并到单个逻辑集合中?

假设,我有一个固定数量的集合(例如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&gt{
私人最终收藏<?扩展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(){
}
}

发表评论