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

时间:2018-08-02 08:18:14

标签: java guava

我有此代码:

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。

2 个答案:

答案 0 :(得分:4)

您需要了解,番石榴Iterables返回的Iterable是一次只能迭代的。 事实证明您的Iterable是一个只能迭代一次。 1 迭代一次后,它不会在后续迭代中抛出,而是为空。

因此,您对它的呼叫Iterables.size实际上会清空Iterable,这就是为什么生成的ArrayList为空的原因。

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


1 句子被删除,因为事实证明番石榴遵守了Iterable的事实标准,即iterable multiple times

答案 1 :(得分:0)

当您调用Iterables.size(components)时,它将使用您传递的Iterable并遍历该集合(通过传递的{调用hasNext上的nextIterator {1}})找出大小。

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

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