返回对象数组List的子列表



查询数据库后得到如下结果

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]);
}

在迭代列表时,我想只返回Closed事件行。如何做到这一点?

我明白了,它可以通过定义一个新的列表并逐个添加对象来完成,但是有没有更好的方法?

为什么要过滤结果集?这似乎有点不必要,为什么不只是添加"IncidentStatus == Closed"到您的查询?

如果您不能将where IncidentStatus=closed添加到sql中,这里是一个建议。

//assume that Obj is one objet with the properties for this row
ArrayList<Obj> ret = new ArrayList<Obj>();
Iterator iter=resultList.iterator();
  while (iter.hasNext()) {
    Object[] result= (Object[]) iter.next();
    //check if the status is closed
    if(result[2].equals("Closed"){
         ret.add(new Obj(result[0],result[1],result[2],result[3]));
    }
}

好吧,首先,如果它是可能的,似乎最好添加限制当你查询数据库,否则我建议你使用Apache Commons Collection FilterIterator

Predicate<Object[]> predicate = new Predicate<>() {
                   evaluate(Object[] obj) { 
                         return (obj[2].equals("Closed")); 
                   }
               };
Iterator<Object[]> filteredIterator = new FilterIterator<>(
                            resultList.iterator, 
                            predicate
                        );

这种方法允许您创建一个通用的表谓词类,它可以帮助您使用任何字段和值过滤迭代器或集合。

假设您使用的是java 1.7

if(resultList == null)
  return;
List<MyClass> toReturn = new ArrayList<>(resultList.size());
for(MyClass element : resultList){
  if (element.isClosedState()){
    toReturn.add(element);
  }
}

你可以使用外部api

lambdaj允许在不编写循环或内部类的情况下过滤集合,如下例所示:

List<MyClass> elements = select(element, having(on(MyClass.class).getProperty(),
    greaterThan(someValue)));

guava or wait Java 8 release.

这个链接可能会帮助你如何过滤一个集合

相关内容

最新更新