3

我正在使用带有以下代码的本机 sql 进行查询

private <T> List<T> executeNativeQuery(String queryString,
        Map<String, Object> param, Class<T> clazz) {
    Query query = entityManager.createNativeQuery(queryString);
    if (param != null && param.size() > 0) {
        for (Map.Entry<String, Object> entry : param.entrySet()) {
            query.setParameter(entry.getKey(), entry.getValue());
        }
    }
    List<T> resultList = query.getResultList();
    return resultList;
}

并获得以下数据库结果。

VendorName | IncidentID | IncidentStatus | IncidentDate
-------------------------------------------------------
XYZ        | 100        |     Open       | 02-JUN-2011    
ABC        | 101        |     Closed     | 03-JUN-2011  
MNP        | 102        |     Open       | 01-JUN-2011  
LPQ        | 103        |     Open       | 01-APR-2011  

为了迭代这个结果,我使用以下方法

 Iterator iter=resultList.iterator();
    while (iter.hasNext()) {
        Object[] result= (Object[]) iter.next();
        System.out.println("Vendor Name-->" +result[0]);
 }

有没有更好的方法来遍历列表?

4

2 回答 2

7

一种“更好的方式”(java 5+ for-each)实际上将使用迭代器转换为您所展示的内容,但语法更好:

for (Object[] result : resultList) {
    // ...

另一种“更好的方法”依赖于您知道列表大小并且可以在 for 循环中使用计数器的事实:

for (int i = 0; i < resultList.size(); i++) {
    Object[] result = resultList.get(i);
    // ... the rest ...

总而言之,有几种方法可以遍历列表,但有争议的是有“更好”的方法:这是一个用例问题(如果您也将该i计数器用于其他事情,或者您正在使用也从列表中iterator删除一些元素)或只是一个口味问题(低级与语法糖)。

于 2013-06-20T19:02:11.677 回答
0

在 Java 5+ 中,for each 循环是首选方式

for (Object[] result : resultList) {...}

这有时可能会有更好的性能,因为它只计算一次集合大小。此外,当使用传统的 for 循环并对两个集合进行嵌套迭代时,您可能会产生错误。Joshua Bloch 在他的“Effective Java”一书的第 46 项中提到了它。当然更详细一点。

http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683/ref=dp_ob_title_bk

于 2013-06-20T19:46:22.403 回答