2012-04-06 9 views

Antwort

1

Das funktioniert, aber ich bin nicht glücklich, dass es so viel Code braucht, um eine einfache for-Schleife zu ersetzen. Ich bevorzuge "Filter" über "Auswahl", weil es den Code einfacher macht, und einfacher zu lesen, denke ich.

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

Nun, es erfordert so viel Code * einmal *. Ich habe meiner Komponententestbibliothek einen Regex-Matcher hinzugefügt, damit ich ihn nicht noch einmal schreiben muss. Wenn ich Matcher im Produktionscode verwende, verschiebe ich den Regex Matcher einfach in eine entsprechende Bibliothek. Wie in meiner Antwort erwähnt, möchte ich diesen Matcher in einer gebrauchsfertigen öffentlichen Bibliothek sehen. –

1

Wenn Sie eine Sammlung filtern Sie wie unten beschrieben, tun:

@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

Danke ... Ich glaube, ich bin immer noch ungläubig, dass 1. Die Syntax so ausführlich ist und 2. Ich habe meinen eigenen Matcher zu schreiben, zu booten, da es kein Regex Matcher in hamcrest zu sein scheint. – wytten

2

Wenn es möglich wäre, es zu tun, um das having(on(...)) Konstrukt, das Gespräch könnte wie folgt aussehen:

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

Aber leider ist es nicht möglich, weil die String Klasse endgültig ist und so on(String.class) nicht in der Lage ist, den Proxy zu erstellen, der von dem having Matcher benötigt wird.

Obwohl hamcrest keine Regex Matcher bringt, müssen Sie nicht Ihre eigenen schreiben. Das Netz bietet mehrere Implementierungen. Ich würde gerne einen solchen Matcher in einer gebrauchsfertigen öffentlichen Bibliothek sehen, die ich einfach als Abhängigkeit einfügen könnte, anstatt den Quellcode kopieren zu müssen.