首页 > 解决方案 > 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);
}

在哪里Componentorg.sonatype.nexus.repository.storage.Component

当我运行它时,它会打印:

Number of components found (before convert): 2
Number of components found (after convert): 0

因此,在我将可迭代对象转换为列表后,元素不再存在。我也从来没有进入下面的循环。

为什么元素没有被复制到列表中,这就是文档所说的:

创建一个包含给定元素的可变 ArrayList 实例;创建一个空列表然后调用 Iterables.addAll 的一个非常薄的快捷方式。

标签: javaguava

解决方案


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

因此,您对它的调用Iterables.size有效地清空了Iterable,这就是结果ArrayList为空的原因。

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


1Iterable句被删除,因为事实证明 Guava 遵守s可多次迭代的事实标准。


推荐阅读