2016-11-17 68 views
0

我有一堆经理类管理不同的对象,如状态,国家等。 getObjects()方法返回这些对象的列表,这些列表的值附加在不同的方法,如下面的:Java:可能的对象列表转换为字符串列表

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

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

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

+0

您能够创建'State'接口,'代码','国家'?如果它们都具有相同的通用方法'getCd()',那么某种接口可能是有意义的。 – Hypino

+1

你有Java 8吗?如果是这样,那很容易。如果不是,你不会比这更好。 –

+1

首先,不要让列表为空。只需要一个空的列表。然后看一下Lists.transform()和Guava的Joiner类 – keuleJ

回答

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); 
} 
+0

不错的解决方案。我绝对需要用番石榴练习更多。 – Dragon

相关问题