私は、さまざまなリストで共通のタスクを実行する必要がある小さなアプリケーションを作成しています。特定の基準でオブジェクトをフィルタリングします。
たとえば、次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つの質問が残ります。
- 外部ライブラリを使用せずにこれを行うためのより短い (そしておそらくよりクリーンな) 方法はありますか?
- このような一般的な高階関数 ( 、 、 など...) のメソッドを提供する推奨されるオープンソース ライブラリは
grep
ありfoldLeft
ますreduceLeft
かmap
?