我在查询数据库
后得到如下结果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事件行。这该怎么做 ?
据我所知,可以通过定义一个新列表并逐个添加一个对象来实现,但是有更好的方法吗?
答案 0 :(得分:0)
为什么要过滤结果集?这看起来有点不必要为什么不在你的查询中添加“IncidentStatus == Closed”?
答案 1 :(得分:0)
如果您无法将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]));
}
}
答案 2 :(得分:0)
好吧,首先,如果它是可行的,在查询数据库时添加限制似乎更好,否则我建议你使用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
);
这个aproach允许您创建一个通用的表谓词类,它可以帮助您使用任何字段和值过滤迭代器或集合。
答案 3 :(得分:0)
假设您使用的是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或等待Java 8
发布。