jquery的map方法可以把List<map>對象中的某項屬性提取成list對象,然後join拼接成字符串,java中卻沒有類似的方法。我之前寫過List<String>和String[]對象的join方法
public static String join(List<String> arr,String split) {
if(arr == null || arr.isEmpty())
return "";
else {
StringBuilder sb = new StringBuilder();
for(String s:arr) {
sb.append(s+split);
}
return sb.substring(0, sb.length()-split.length()).toString();
}
}
想要實現任意對象的join第一想法就是使用反射,將需要反射的字段字符串傳進來,但是這樣直接輸入字符串比較low,要是字段修改了就容易出現問題,一般來說我也不喜歡直接在代碼中使用字符串,一般也用枚舉或靜態常量。於是一番考慮之下我決定使用匿名方法實現更加靈活的方案。
public class StringUtils {
public abstract static class Joint<T> {
public abstract String map(T t);
}
public static <T> String join(List<T> arr,String split, Joint joint) {
if(arr == null || arr.isEmpty())
return "";
else {
StringBuilder sb = new StringBuilder();
for(T s:arr) {
sb.append(joint.map(s)+split);
}
return sb.substring(0, sb.length()-split.length()).toString();
}
}
public <T> String[] map(List<T> list, Joint joint) {
if(list == null)return new String[0];
String[] arr = new String[list.size()];
for(int i=0;i<list.size();i++) {
arr[i] = joint.map(list.get(i));
}
return arr;
};
public static void main(String[] args) {
List<BaseUserModel> list = new ArrayList<>();
BaseUserModel u1 = new BaseUserModel();
u1.setRealName("張三");
list.add(u1);
BaseUserModel u2 = new BaseUserModel();
u2.setRealName("李四");
list.add(u2);
System.out.println(StringUtils.join(list, ",", new StringUtils.Joint<BaseUserModel>() {
@Override
public String map(BaseUserModel t) {
return t.getRealName() + "1";
}
}));
System.out.println(StringUtils.join(list, ",", new StringUtils.Joint<BaseUserModel>() {
@Override
public String map(BaseUserModel t) {
return t.getRealName() + "2";
}
}));
}
}
執行結果
這裏使用靜態內部類的原因是普通的內部類需要實例化外部類再用外部類實例化內部類,我覺得首先是麻煩,其次是不符合邏輯。