Использование lambdaj со строкой.совпадений метод


Как фильтровать Collection<String>, используя lambdaj и строку.соответствует способ.
Я новичок в lambdaj и чувствую себя глупым, так как приведенные примеры более сложны, чем это.

3 3

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);
  }