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

com.google.common.collect.Lists.newArrayList throws away my elements

我有这个代码:

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

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

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

Creates a mutable ArrayList instance containing the given elements; a very thin shortcut for creating an empty list then calling Iterables.addAll.

您需要了解 Guava 的 Iterables 返回的 Iterable 是一个仅可迭代的对象。 事实证明您的Iterable 是一个只能迭代一次的对象。1 迭代一次后,它不会抛出后续迭代,而是空的。

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

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


1 句子被删除,因为事实证明 Guava 遵守 Iterables 的事实标准 iterable multiple times.

当您调用 Iterables.size(components) 时,它使用您传递的 Iterable 并遍历集合(从 Iterator 调用 hasNextnext通过 Iterable) 找出尺寸。

因此,当您第二次调用 newArrayList 时,Itertor 现在是空的(调用 hasNext 将 return false)。

您需要创建一个新的 Iterable 并传递给 newArrayList