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 遵守 Iterable
s 的事实标准 iterable multiple times.
当您调用 Iterables.size(components)
时,它使用您传递的 Iterable
并遍历集合(从 Iterator
调用 hasNext
和 next
通过 Iterable
) 找出尺寸。
因此,当您第二次调用 newArrayList
时,Itertor
现在是空的(调用 hasNext
将 return false)。
您需要创建一个新的 Iterable 并传递给 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
因此,在我将可迭代对象转换为列表后,元素不再存在。我也从来没有进入以下循环。
为什么元素没有被复制到列表中,这就是文档所说的:
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 遵守 Iterable
s 的事实标准 iterable multiple times.
当您调用 Iterables.size(components)
时,它使用您传递的 Iterable
并遍历集合(从 Iterator
调用 hasNext
和 next
通过 Iterable
) 找出尺寸。
因此,当您第二次调用 newArrayList
时,Itertor
现在是空的(调用 hasNext
将 return false)。
您需要创建一个新的 Iterable 并传递给 newArrayList