有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

GuavaJava:对象列表到字符串列表的可能转换

我有很多管理类,它们管理不同的对象,比如州、国家等等getObjects()方法返回此类对象的列表,这些列表的值附加在不同的方法中,如以下方法:

//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()检索)并返回一个字符串列表

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

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


共 (1) 个答案

  1. # 1 楼答案

    如果没有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);
    }