我有此代码:
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。
答案 0 :(得分:4)
您需要了解,番石榴 事实证明您的Iterables
返回的Iterable
是一次只能迭代的。Iterable
是一个只能迭代一次。 1 迭代一次后,它不会在后续迭代中抛出,而是为空。
因此,您对它的呼叫Iterables.size
实际上会清空Iterable
,这就是为什么生成的ArrayList
为空的原因。
相反,您应该将Iterable
尽快转储到ArrayList
。
1 句子被删除,因为事实证明番石榴遵守了Iterable
的事实标准,即iterable multiple times。
答案 1 :(得分:0)
当您调用Iterables.size(components)
时,它将使用您传递的Iterable
并遍历该集合(通过传递的{调用hasNext
上的next
和Iterator
{1}})找出大小。
因此,当您第二次调用Iterable
时,newArrayList
现在为空(调用Itertor
将返回false)。
您需要创建一个新的Iterable并传递给hasNext