Guava 谓词过滤各种条件,无需匿名 class 或额外 classes

Guava predicate to filter various conditions without anonymous class or extra classes

使用 Java 6 和 Guava 12.0 我正在尝试根据字符串列表是否具有特定前缀与否。有没有一种方法可以在不使用匿名 classes 或为我想要的每个不同前缀使用单独的 class 的情况下做到这一点?

这行得通,但它很丑(我删除了我公司强加的格式后更丑)。

private String foo(String prefix, List<String> stuff) {

    Collection<String> withPrefix = Collections2.filter(stuff, new Predicate<String>() {
        @Override
        public boolean apply(String input) {
            return input.startsWith(prefix);
        }
    });
    //...
}

当然我可以做类似下面的事情。

public class PrefixCheckForAA implements Predicate<String> {

    @Override
    public boolean apply(String input) {
        return input.startsWith("AA");
    }
}

public class PrefixCheckForZZ implements Predicate<String> {

    @Override
    public boolean apply(String input) {
        return input.startsWith("ZZ");
    }
}

没有匿名 classes 或一堆看似多余的 classes 有没有办法做到这一点?

我在写这篇文章的时候找到了一个解决方案,我不敢相信我这么傻竟然没有想到这个...

简单地让class有一个需要String的构造函数,使用这个String作为前缀来检查。

public class PrefixChecker implements Predicate<String> {

    private final String prefix;

    public Prefix(String prefix) {
        this.prefix = prefix;
    }

    @Override
    public boolean apply(String input) {
        return input.startsWith(prefix);
    }
}

虽然您自己的解决方案完全有效,但您可以使用 Guava 库功能进一步精简代码:

Collection<String> withPrefix = Collections2.filter(stuff, Predicates.containsPattern("^AA"));

有关 Predicates 的所有功能的列表,请转至 here