2017-02-03 51 views
-1

请注意这是一个错误的问题。我问了这个问题,因为当我尝试使用Iterator时,我的IntelliJ在“Iterator”上一直警告Iterator不能有类型参数,这是不正确的。使用清单的高效方式

不知何故,我的IntelliJ似乎显示了Java 1.4的javadoc。我仍然试图解决它。谢谢。

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^

我在一个java程序中,一个api返回一个列表。

我处理这种方式是:

ArrayList<SomeObject> arrayList = new ArrayList<>(apiThatReturnsAList); 
for (SomeObject someObject : arrayList) { 
    ... 
} 

我的代码评审表明,这可能是对付它,因为它拷贝数据的效率较低的方式。他建议我使用迭代器。但我发现代码会是这样的:

Iterator iterator = apiThatReturnsAList.iterator(); 
while (iterator.hasNext()) { 
    SomeObject someObject = (SomeObject)iterator.next(); 
} 

有丑陋的铸造在这里,我们不想看到,因为它不安全。

那么,有没有一种有效的方法来处理这个API,而不是复制数据?

谢谢!

+0

您应该使用泛型。 – SLaks

+2

为什么你认为你需要复制'List'?任何你为什么使用** raw type **'Iterator'。你为什么直接引用一个'ArrayList'。如果我是你的评论者,我会对这个烂摊子有不少评论。 –

+0

简单地迭代返回的列表首先出现什么问题? – GhostCat

回答

4

为了避免复制,你可以使用foreachapiThatReturnsAList

for (SomeObject someObject : apiThatReturnsAList) { 
    ... 
} 

事实上,foreach确实引擎盖JLS 14.14.2. The enhanced for statement

4

只是与预期类参数的迭代器:

Iterator<SomeObject> iterator = apiThatReturnsAList.iterator(); 

,当你调用next()你会得到一个SomeObject实例:

Iterator<SomeObject> iterator = apiThatReturnsAList.iterator(); 
while (iterator.hasNext()) { 
    SomeObject someObject = iterator.next(); 
} 
+0

迭代器有类型参数? –

+2

@BoYuan哦,来吧。真? [RTFM](https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html)。 –

+0

其实,在问这个问题之前,我是这样做的。我跟踪了一下,并没有在我的图书馆看到这个。而IntelliJ一直告诉我迭代器没有类型参数。 –

0

使用下与迭代器相同的工作,每个打印单元的内容在apiThatReturnsList

for (SomeObject element : apiThatReturnsList) { 
    System.out.println(element); 
} 

有没有需要复制的清单进入另一个列表。