Wie Sie eine Collection<String>
mithilfe von Lambdaj und die String.matches-Methode filtern.
Ich bin neu zu Lambdaj und fühle mich dumm, da die angegebenen Beispiele komplizierter sind.Verwenden von Lambdaj mit String.matches-Methode
Antwort
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);
}
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());
}
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
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.
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. –