3

我正在编写一个小型应用程序,它需要在许多不同的列表上执行一项常见任务:按给定条件过滤对象。

例如,有一个类的 ArrayListFoo具有属性int barboolean baz

class Foo {
    int bar;
    boolean baz;
}

bar > 1我想从该 ArrayList中检索一个仅包含与给定条件(例如)匹配的对象的新列表。在 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 相比,这段代码看起来相当臃肿,我想知道我是否没有遗漏一些东西。所以这给我留下了两个问题:

  1. 在不使用任何外部库的情况下,是否有更短(也许更清洁)的方法来做到这一点?
  2. 是否有推荐的开源库为此类常见的高阶函数(如grepfoldLeftreduceLeftmap......)提供方法?
4

2 回答 2

1

您可以使用JFilter 来查询 java 集合。

另一种选择是将Commons Collections与谓词一起使用(如此所述)

祝你好运!

于 2012-06-27T06:14:38.280 回答
0

或者您可以将grep4j用于 java greps。(也适用于远程文件)

于 2013-04-10T09:03:47.350 回答