我有这个代码:
int size = Iterables.size(components);
log.info("Number of components found (before convert): " + size);
List<Component> listOfComponents = Lists.newArrayList(components);
size = listOfComponents.size();
log.info("Number of components found (after convert): " + size);
for (Component component : listOfComponents) {
log.info("component : " + component);
}
Component
在哪里:org.sonatype.nexus.repository.storage.Component
当我运行它时,它会打印:
Number of components found (before convert): 2
Number of components found (after convert): 0
因此,在我将迭代对象转换为列表后,元素不再存在。我也从来没有进入过下面的循环。
为什么元素没有复制到列表中,这就是文档所说的:
创建一个包含给定元素的可变 ArrayList 实例;一个 用于创建空列表然后调用的非常薄的快捷方式 Iterables.addAll.
Iterables
返回的Iterable
是一次Iterable
是一次性的可迭代对象。1迭代一次后,它不会在后续迭代时抛出,而是为空。
因此,你对它的调用Iterables.size
有效地清空了Iterable
,这就是为什么得到的ArrayList
是空的。
相反,您应该尽快将Iterable
转储到ArrayList
。
删除了1句话,因为事实证明番石榴坚持了Iterable
多次迭代的事实标准。
当你调用Iterables.size(components)
时,它会使用你传递的Iterable
并遍历集合(从传递的Iterable
中调用hasNext
和next
Iterator
)来找出大小。
因此,当您对newArrayList
进行第二次调用时,Itertor
现在为空(调用hasNext
将返回 false)。
您需要创建一个新的可迭代对象并传递给newArrayList