2016-11-17 67 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

相關問題