2012-04-06 5 views
3

lambdajとString.matchesメソッドを使用してCollection<String>をフィルタリングする方法
私はlambdajに新しく、与えられた例がこれより複雑であるので、ダムを感じていません。lambdajとString.matchesメソッドの使用

答えて

1

これはうまくいきますが、単純なforループを置き換えるのにこのコードが多くかかることは不幸です。 "select"よりも "filter"を好む理由は、コードが簡単で読みやすいと思うからです。

public Collection<String> search(String regex) { 
    List<String> matches = filter(matches(regex), dictionary); 
    return matches; 
    } 

    static class MatchesMatcher extends TypeSafeMatcher<String> { 

    private String regex; 

    MatchesMatcher(String regex) { 
     this.regex = regex; 
    } 

    @Override 
    public boolean matchesSafely(String string) { 
     return string.matches(regex); 
    } 

    public void describeTo(Description description) { 
     description.appendText("matches " + regex); 
    } 

    } 

    @Factory 
    public static Matcher<String> matches(String regex) { 
    return new MatchesMatcher(regex); 
    } 
+1

さて、それは多くのコード* once *が必要です。私は私のユニットテストライブラリに正規表現マッチャーを追加しましたので、再度書き込む必要はありません。プロダクションコードでマッチャーを使用する場合は、正規表現マッチャーを適切なライブラリーに移動します。私の答えに書かれているように、私はすぐに使える公共図書館にこのマッチャーを見たいと思います。 –

1

あなたは以下に述べるように、あなたが行うことができますコレクションをフィルタリングする場合:

@Test 
public void test() { 
    Collection<String> collection = new ArrayList<String>(); 
    collection.add("foo"); 
    collection.add("bar"); 
    collection.add("foo"); 

    List<String> filtered = select(collection, having(on(String.class), equalTo("foo"))); 
    assertEquals(2, filtered.size()); 
} 
+0

おかげで...私は、私は信じられない思いでまだ思うよ1.構文はhamcrestには正規表現マッチャはないようであるので、私は、ブートするために私自身のマッチャーを記述する必要がありそう冗長と2であること。 – wytten

2

それはhaving(on(...))構文を使用してそれを行うことは可能だった場合、呼び出しは次のようになります。

select(collection, having(on(String.class).matches("f*"))) 

しかし、残念ながらStringクラスがfinalであり、on(String.class)havingマッチャーで必要なプロキシを作成できないため、残念ながらそれは不可能です。

hamcrestは正規表現マッチャーを持ちませんが、自分で書く必要はありません。ネットはいくつかの実装を提供します。私は、ソースコードをコピーするのではなく、すぐに使える公立図書館でそのようなマッチャーを見たいと思います。

関連する問題