查询数据库后得到如下结果
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.
这个链接可能会帮助你如何过滤一个集合