Java Guava谓词用于过滤各种条件,无需匿名类或额外类

Java Guava谓词用于过滤各种条件,无需匿名类或额外类,java,guava,Java,Guava,使用Java 6和Guava 12.0我试图根据字符串是否具有特定前缀来筛选字符串列表。有没有一种方法可以做到这一点,而不必为我想要的每个不同前缀使用匿名类或单独的类 这是可行的,但很难看(我已经删除了公司强加的格式,甚至更难看) 私有字符串foo(字符串前缀,列表内容){ Collection withPrefix=Collections2.filter(填充,新谓词(){ @凌驾 公共布尔应用(字符串输入){ 返回输入.startsWith(前缀); } }); //... } 当然,我可

使用Java 6和Guava 12.0我试图根据字符串是否具有特定前缀来筛选字符串列表。有没有一种方法可以做到这一点,而不必为我想要的每个不同前缀使用匿名类或单独的类

这是可行的,但很难看(我已经删除了公司强加的格式,甚至更难看)

私有字符串foo(字符串前缀,列表内容){
Collection withPrefix=Collections2.filter(填充,新谓词(){
@凌驾
公共布尔应用(字符串输入){
返回输入.startsWith(前缀);
}
});
//...
}
当然,我可以做如下的事情

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");
    }
}
公共类PrefixCheckForAA实现谓词{
@凌驾
公共布尔应用(字符串输入){
返回输入。用“AA”开始;
}
}
公共类PrefixCheckForZZ实现谓词{
@凌驾
公共布尔应用(字符串输入){
返回输入。开始使用(“ZZ”);
}
}

如果没有匿名类或一堆看似多余的类,有什么方法可以做到这一点吗?

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

只要让类有一个需要字符串的构造函数,就可以使用这个字符串作为前缀来检查

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);
    }
}
公共类PrefixChecker实现谓词{
私有最终字符串前缀;
公共前缀(字符串前缀){
this.prefix=前缀;
}
@凌驾
公共布尔应用(字符串输入){
返回输入.startsWith(前缀);
}
}

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

只要让类有一个需要字符串的构造函数,就可以使用这个字符串作为前缀来检查

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);
    }
}
公共类PrefixChecker实现谓词{
私有最终字符串前缀;
公共前缀(字符串前缀){
this.prefix=前缀;
}
@凌驾
公共布尔应用(字符串输入){
返回输入.startsWith(前缀);
}
}

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

Collection<String> withPrefix = Collections2.filter(stuff, Predicates.containsPattern("^AA"));
Collection with prefix=Collections2.filter(stuff、谓词.containsPattern(^AA));

有关
谓词的所有功能的列表,请转到。

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

Collection<String> withPrefix = Collections2.filter(stuff, Predicates.containsPattern("^AA"));
Collection with prefix=Collections2.filter(stuff、谓词.containsPattern(^AA));

有关
谓词的所有功能的列表,请转到。

是否不可能迁移到Java 8?(并不是说我反对番石榴!)@Scribaniwanbe对我来说,是的。这就是我在问题中强调Java6的原因。看起来我们也不会很快就去java 7了。明白了。虽然很遗憾你们不能升级,但我也在这个行业工作,我知道有时候这不是一个选择。话虽如此,但在下文中做得非常好。我是Guava库的忠实支持者。迁移到Java8是不可能的吗?(并不是说我反对番石榴!)@Scribaniwanbe对我来说,是的。这就是我在问题中强调Java6的原因。看起来我们也不会很快就去java 7了。明白了。虽然很遗憾你们不能升级,但我也在这个行业工作,我知道有时候这不是一个选择。话虽如此,但在下文中做得非常好。我是Guava库的忠实支持者。将其编辑为
“^”+前缀
,这样前缀就是变量。将其编辑为
“^”+前缀
,这样前缀就是变量。