最近,有个需求需要将List<实体类> 转换成map的,map的key 是由实体类的几个字段拼接而成。这个操作用到的地方很多,于是就想写个方法,专门用来拼接key。但是参数的个数不定,因为每个实体类需要拼接的字段不一定。于是就把入参改成了动态参数。结果如下。
/**
* 按照主键拼接map的key值
*
* @param arg
* @return
*/
private String getKey(String... arg) {
return String.join("-", arg);
}
这样子,经过测试, 结果当然符合要求。其中String... org代表的是String[] org
但是也可以发现,入参的类型必须保持一致,必须都为String,而需要的拼接的字段不一定都为String,所以传参的时候,还要经过类型转换,很不好看。
那么,如果把入参改为Object... org,将类型转换放在方法体内,而不是入参这,是不是就可以了
但是呢,后来发现,String.join("-",org)方法,在做拼接的时候,需要org必须为String[]
这里就涉及到了将Object[] 转成String[]了,当然使用for循环,很简单,但是Arrays给了一个现成的方法:Arrays.copyOf
该方法主要用于数组的复制,返回值是一个新数组。
形式如下:
Arrays.copyOf(arg, arg.length, String[].class);
修改一下就成了下面这个方法了。那么使用getKey的时候,入参就不需要再转成String了。
/**
* 按照主键拼接map的key值
*
* @param arg
* @return
*/
private String getKey(Object... arg) {
String[] strings = Arrays.copyOf(arg, arg.length, String[].class);
return String.join("-", strings);
}
这个方法第一次测试的时候确实是可以用,后来再用的时候,发现有问题。没来及的细究,换了第二种方法
方法如下:
private String getKey(Object... arg) {
String[] strings = Arrays.stream(arg).map(Object::toString).toArray(String[]::new);
return String.join("-", strings);
}