Использование lambdaj со строкой.совпадений метод
Как фильтровать Collection<String>
, используя lambdaj и строку.соответствует способ.
Я новичок в lambdaj и чувствую себя глупым, так как приведенные примеры более сложны, чем это.
3 ответа:
Если бы это было возможно сделать с помощью конструкции
having(on(...))
, вызов мог бы выглядеть следующим образом:Но, к сожалению, это невозможно, потому что классselect(collection, having( on(String.class).matches("f*") ))
String
является конечным и поэтомуon(String.class)
не может создать прокси, необходимый для сопоставленияhaving
.Хотя hamcrest не приноситрегулярное выражение matcher , Вам не нужно писать свой собственный. Сеть предлагает несколько реализаций. Я хотел бы видеть такой матчер в готовой к использованию публичной библиотеке, которую я мог бы просто включить в качестве зависимость, вместо того, чтобы копировать исходный код.
Если вы хотите отфильтровать коллекцию, вы можете сделать так, как описано ниже:
@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()); }
Это работает, но я не рад, что требуется столько кода, чтобы заменить простой цикл for. Я предпочитаю "filter" вместо "select", потому что это делает код проще и легче читать, я думаю.
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); }