番石榴谓词过滤各种条件,没有匿名类或额外的类

时间:2015-05-29 20:24:45

标签: java guava

使用Java 6和Guava 12.0 我试图根据字符串列表是否具有特定的前缀来过滤它们。有没有办法不使用匿名类或为我想要的每个不同前缀使用单独的类?

这样可行,但它很丑陋(甚至更糟糕的是我的公司强加的格式我已删除)。

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

如果没有匿名课程或一堆看似多余的课程,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:4)

我在写这篇文章时找到了一个解决方案,我简直不敢相信我这么傻也没想到......

只需使类具有需要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);
    }
}

答案 1 :(得分:3)

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

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

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