3

如何过滤Collection<String>使用 lambdaj 和 String.matches 方法。
我是 lambdaj 的新手并且感觉很愚蠢,因为给出的例子比这更复杂。

4

3 回答 3

2

如果可以使用having(on(...))构造来完成,调用可能如下所示:

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

但不幸的是,这是不可能的,因为String该类是最终的,因此on(String.class)无法创建having匹配器所需的代理。

尽管 hamcrest 没有带来正则表达式匹配器,但您不必自己编写。网络提供了几种实现方式。我希望在现成的公共库中看到这样的匹配器,我可以简单地将其包含为依赖项,而不必复制源代码。

于 2012-04-06T15:13:59.720 回答
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());
}
于 2012-04-06T14:01:30.720 回答
1

这行得通,但我不高兴需要这么多代码来替换一个简单的 for 循环。我更喜欢“过滤器”而不是“选择”,因为我认为它使代码更简单,更容易阅读。

  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);
  }
于 2012-04-09T14:09:49.777 回答