java 对象中集合属性及复制
本文我们介绍集合属性的复制场景及多种实现方式。
对象中集合属性
实际应用中对象中的集合属性很常见,表达一对多的关系。如用户有多个地址,订单包括多个产品等。一般我们需要定义集合属性,并提供set、get方法。
下面示例定义属性检查类,每个属性拥有多个验证规则:
@NoArgsConstructor
public class PropCheck {
/**
* 属性名称
*/
@Setter
@Getter
private String name;
/**
* 中文描述
*/
@Setter
@Getter
private String desc;
/**
* 数据类型:string,number,date
*/
@Setter
@Getter
private String type;
private PropCheck(String name, String desc, String type){
this.name = name;
this.desc = desc;
this.type = type;
}
public static PropCheck of(String name, String desc, String type){
return new PropCheck(name, desc, type);
}
/**
* 属性验证规则集
*/
private List<String> checkRules = Lists.newArrayList();
/**
* 增加验证规则
* @param rule 新的规则
*/
public PropCheck addRule(String rule){
checkRules.add(rule);
return this;
}
/**
* 获取验证规则
* @return 验证规则集合的拷贝
*/
public List<String> getCheckRules(){
return Lists.newArrayList(checkRules);
}
}
为了避免list被随意修改,增加只能通过addRule方法增加,getCheckRules方法返回了规则集合的副本。
上面list复制,通过guava的Lists类进行复制,下面我们通过map来展示多种复制方式,list也一样。
map的多种复制方式
java内置API实现
最简单的方式是通过迭代map并调用put(k,v)方法实现:
``````
public static<K,V> Map<K,V> clone(Map<K,V> original) {
Map<K,V> copy = new HashMap<>();
for (Map.Entry<K,V> entry: original.entrySet()) {
copy.put(entry.getKey(), entry.getValue());
}
return copy;
}
使用putAll(Collectioini<? extends E> c)
map.putAll方法可以一次从源拷贝所有项至目标map:
public static<K,V> Map<K,V> clone(Map<K,V> original) {
Map<K,V> copy = new HashMap<>();
copy.putAll(original);
return copy;
}
使用java 8 流API
java 8 流可以实现集合拷贝:
public static<K,V> Map<K,V> clone(Map<K,V> original) {
return original.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue));
}
通过json 实现深复制
我们也可以使用 json库实现序列化与反序列化集合对象。通过转换集合为json字符串,然后再把json字符串转成集合对象。改过程是深复制,之前示例都是浅复制,当然对于基本数据类型及字符串两者一样。
下面代码利用GSON,读者也可以使用JACKSON:
public static<K,V> Map<K,V> clone(Map<K,V> original) {
Gson gson = new Gson();
String jsonString = gson.toJson(original);
return gson.fromJson(jsonString, Map.class);
}
总结
本文介绍集合复制场景,并提供多种方式实现集合拷贝,包括深复制。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/85160320