Skip to main content
 首页 » 编程设计

java 对象中集合属性及复制

2022年07月19日157soundcode

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