让我们假设我有一个包含多个String字段的类。
public class Person {
private String address;
private String first_name;
//etc
现在让我们说我有一个人员名单:
List<Person>
我想编写一个方法,可以解析此列表中的特定字符串值,例如address=="California"
。
问题是我在这个类中有多个字段,如果我为每个字段创建一个方法,那将会有很多代码重用。
我也可以这样做:
public List<Person> filter(List<Person> plist, String fieldToParse, String value){
//simple loop that removes the Person.fieldToParse == Person.value values
}
但是,对我来说,这样做有一种更简单,更简单的方法吗?
答案 0 :(得分:4)
如果您的目标是通过属性过滤Person对象,您可以查看lambdaj库(https://code.google.com/p/lambdaj/)。请参阅此问题/答案What is the best way to filter a Java Collection?
答案 1 :(得分:2)
您可以使用任何LAMBDA库,也可以自己实施。看我的代码:
public static List<Person> filter(List<Person> source, String fieldToParse, String value) {
// Field getter
Method fieldGetter = null;
try {
fieldGetter = Person.class.getMethod("get" + firstUpperCase(fieldToParse));
} catch (NoSuchMethodException ex) {
throw new IllegalArgumentException("Invalid field name: " + fieldToParse);
}
// Filter
List<Person> list = new ArrayList<Person>();
for (Person person : source) {
try {
Object obj = fieldGetter.invoke(person);
//TODO: process NULL here
if (obj.equals(value)) {
list.add(person);
}
} catch (Exception e) {
}
}
return list;
}
public static String firstUpperCase(String str) {
if (str == null) {
return null;
}
if (str.isEmpty() == false) {
char[] chars = str.toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
return new String(chars);
}
return str;
}
样本使用:
filter ( source, "address", "abc");
filter ( source, "first_name", "july");
答案 2 :(得分:1)
当您定义类似于您建议的方法时,会丢失类型安全性(以及编译时的某些错误检测) 如果有人会使用不存在的字段字符串调用此方法,会发生什么?
要实现此目标,您可以尝试使用Guava集合库 Collection2类中有一个获取谓词的过滤器方法 请参阅http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Collections2.html。
如果此类过滤器很常见,您可以提供一个辅助方法,为预定义的字段集创建谓词。