我正在编写一个小应用程序,它需要在许多不同的列表上执行一个常见的任务:按给定条件过滤对象。
例如,类Foo
有一个 ArrayList,它具有属性 int bar
和 boolean baz
:
class Foo {
int bar;
boolean baz;
}
我想从该 ArrayList 中检索一个新列表,该列表仅包含与给定条件(例如 bar > 1
)匹配的对象。在其他语言中,如Perl,我只需使用grep()
来获取所有这些对象:
@where_bar_greater_one = grep { $_->{bar} > 1 } @list;
但是对于Java来说,这似乎并不容易。现在,我使用静态方法模拟了这种行为,该方法使用匿名内部类遍历所有元素:
interface ListPredicate<T> {
boolean match(T item);
}
class ListUtil {
public static <T> List<T> grep(List<T> source, ListPredicate<T> predicate) {
ArrayList<T> results = new ArrayList<T>();
for(T item : source) {
if(predicate.match(item)) results.add(item);
}
return results;
}
}
ArrayList<Foo> found = new ArrayList<Foo>(ListUtil.grep(list, new ListPredicate<Foo>() {
@Override public boolean match(Foo item) {
return item.bar > 1 ? true : false;
}
}));
与Perl的一小段相比,这段代码看起来相当臃肿,我想知道我是否没有错过什么。因此,这给我留下了两个问题:
- 有没有一种更短(也许更干净)的方法可以在不使用任何外部库的情况下做到这一点?
- 是否有推荐的开源库为这些常见的高阶函数(如
grep
、foldLeft
、reduceLeft
、map
等)提供方法?
您可以使用 JFilter 查询 java 集合。
另一种选择是将共享资源集合与谓词一起使用(如此处所述)
祝你好运!
或者你可以将grep4j用于java greps。(也适用于远程文件)