简化java中的方法设计

时间:2014-04-16 16:10:05

标签: java

让我们假设我有一个包含多个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
}

但是,对我来说,这样做有一种更简单,更简单的方法吗?

3 个答案:

答案 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

如果此类过滤器很常见,您可以提供一个辅助方法,为预定义的字段集创建谓词。