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";
}
}));
}
}
执行结果
这里使用静态内部类的原因是普通的内部类需要实例化外部类再用外部类实例化内部类,我觉得首先是麻烦,其次是不符合逻辑。