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。
使用 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。