3

私は、さまざまなリストで共通のタスクを実行する必要がある小さなアプリケーションを作成しています。特定の基準でオブジェクトをフィルタリングします。

たとえば、次Fooの属性を持つクラスの ArrayList がint barありboolean 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 の小さな部分と比べると、このコードはかなり肥大化しているように見えます。したがって、これにより2つの質問が残ります。

  1. 外部ライブラリを使用せずにこれを行うためのより短い (そしておそらくよりクリーンな) 方法はありますか?
  2. このような一般的な高階関数 ( 、 、 など...) のメソッドを提供する推奨されるオープンソース ライブラリはgrepありfoldLeftますreduceLeftmap?
4

2 に答える 2

1

JFilter を使用して Java コレクションを照会できます。

もう 1 つのオプションは、Commons Collectionsを述語とともに使用することです (ここで説明されているように) 。

幸運を!

于 2012-06-27T06:14:38.280 に答える