com.google.common.collect.Lists.newArrayList扔掉了我的元素



我有这个代码:

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.

您需要了解,GuavaIterables返回的Iterable是一次的可迭代对象。事实证明,您的Iterable是一次性的可迭代对象。1迭代一次后,它不会在后续迭代时抛出,而是为空。

因此,你对它的调用Iterables.size有效地清空了Iterable,这就是为什么得到的ArrayList是空的。

相反,您应该尽快将Iterable转储到ArrayList


删除了1句话,因为事实证明番石榴坚持了Iterable多次迭代的事实标准。

当你调用Iterables.size(components)时,它会使用你传递的Iterable并遍历集合(从传递的Iterable中调用hasNextnextIterator)来找出大小。

因此,当您对newArrayList进行第二次调用时,Itertor现在为空(调用hasNext将返回 false)。

您需要创建一个新的可迭代对象并传递给newArrayList

最新更新