Java:可能将对象列表转换为字符串列表

Java: possible transformation of List of objects to List of strings

我有一群经理 类 管理不同的对象,如州、国家等。 getObjects() 方法 returns 此类对象的列表,这些列表的值附加在不同的方法中,如下所示:

//states - StateManager.java
public String getStateMsg() {
    StringBuilder msg = new StringBuilder();
    if (states != null) {
        for (State state : states.getObjects()) {
            msg.append(state.getStateCd())).append(" ");
        }
    }
    return msg.toString().trim();
}

//codes - CodeManager.java
public String getCodeMsg() {
    StringBuilder msg = new StringBuilder();
    if (codes != null) {
        for (Code code :  codes.getObjects()) {
            msg.append(code.getCd()).append(" ");
        }
    }
    return msg.toString().trim();
}

//countries - CountryManager.java
public String getCountriesMsg() {
    StringBuilder msg = new StringBuilder();
    if (countries != null) {
        for (Country country : countries.getObjects()) {
            msg.append(countries.get(country.getCountryCd())).append(" ");
        }
    }
    return msg.toString().trim();
}

存在明显的代码重复,我想制定通用解决方案,其中一个方法采用一个集合(由 getObjects() 检索)和 return 一个字符串列表。

我发现番石榴可以从一种类型到另一种类型进行某种集合转换。但是示例中的 类 (State, Code, Country) 不共享任何通用接口。另一方面,一个方法将使用对象集合和方法名称来检索特定对象字段的值,这意味着使用反射不是一个好主意。

因此我有一个问题,是否有可能避免所描述的代码重复并制作一个实用方法来获取对象集合和 return 字符串集合?

如果您没有 Java 8,请使用泛型和 Guava Function:

public static <T, U> String getGenericMsg(List<T> genericList, Function<T, U> function) {
    StringBuilder msg = new StringBuilder();
    if (genericList != null) {
        for (T genericObject : genericList) {
            msg.append(function.apply(genericObject)).append(" ");
        }
    }
    return msg.toString().trim();
}


private static Function<State, String> STATE_TO_STRING = new Function<State, String>() {
    public String apply(State input) {
        return input.getStateCd();
    }
};

private static Function<Code, String> CODE_TO_STRING = new Function<Code, String>() {
    public String apply(Code input) {
        return input.getCd();
    }
};

private static Function<Country, String> COUNTRY_TO_STRING = new Function<Country, String>() {
    public String apply(Country input) {
        return input.getCountryCd();
    }
};

最后是您的客户端代码:

public void yourClientMethod() {
    getGenericMsg(states, STATE_TO_STRING);
    getGenericMsg(codes, CODE_TO_STRING);
    getGenericMsg(countries, COUNTRY_TO_STRING);
}