我有一个List<Pair<String, String>>
我希望从Collection
复制数据。
阅读该集合并将项目添加到列表的最佳方式是什么?
List<Pair<String, String>> identityMemoPairs = new LinkedList<Pair<String, String>>();
Collection result = handler.getResult();
while(result.iterator().hasNext()){
IdentityM im =(IdentityM) result.iterator().next();
identityMemoPairs.add(Pair.of(im.identity,im.memo));
}
答案 0 :(得分:3)
您的代码是错误的,因为您在while循环的每次迭代中都创建了一个新的迭代器(实际上您创建了两个迭代器)。每个新的迭代器都将指向result
集合的开头。因此,您创建了一个无限循环。
要解决此问题,请只调用result.iterator()
一次,然后将结果存储在变量中。
但更好(更好阅读,更不容易出错)将是for-each循环,它(几乎总是)是迭代集合的首选变体:
for (IdentityM im : (Collection<IdentityM>)result) {
identityMemoPairs.add(Pair.of(im.identity,im.memo));
}
编译器会使用迭代器自动将其转换为代码,因此没有性能差异。一般来说,只要避免在get(i)
上调用LinkedList
等一些不好的事情,在迭代集合时性能就不是问题。
请注意,编译器会在这里给出一个警告,它与迭代无关,但是使用原始类型Collection
(而不是Collection<IdentityM>
)。请检查handler.getResult()
是否实际返回Collection<IdentityM>
并尽可能将result
变量的类型更改为此。
另一个问题是你是否真的需要该列表作为对列表。通常不建议使用普通对类,因为它们的名称不显示它们所代表的对象的含义。例如,最好使用类PersonName
,其中包含名字和姓氏的字段,而不是Pair<String, String>
。你为什么不能只使用List<IdentityM>
?如果你可以使用它,你确定你不能使用Collection<IdentityM>
吗? (List
和Collection
通常可以互换。)然后您可以完全避免复制。
答案 1 :(得分:0)
你的代码很好。但是你可能会让handler
直接返回一个Pairs集合,这样你就可以调用identityMemoPairs.addAll()
而不是自己迭代集合。但这只会使它“更漂亮”,但它不能提供更多性能。