我有一个存储自定义Object的HashMap,并将其映射到类中的某个ArrayList。我的类与另一个类(想想MVC样式)进行通信,并传递该hashmap的副本。所以,在我的"模型"中,我会:
public Map<AbstractArtistry, ArrayList<AbstractCommand>> getHashMap() {
return new LinkedHashMap<AbstractArtistry, ArrayList<AbstractCommand>>(this.hashmap);
}
然而,我的&#34;控制器&#34;,当它得到它时,仍然可以编辑模型的this.hashmap内的AbstractArtistries。为了避免这种情况,我是否必须一遍又一遍地创建一个抽象艺术的新实例,或者有更简洁的方法来做到这一点?意思是,我是否必须遍历model.hashmap.keySet(),创建每个artistry的新实例,将其插入到新的hashmap中(并对所有值执行相同操作),然后返回新的hashmap?还是有更清洁的方式?
答案 0 :(得分:1)
您可以使用流复制地图并用防御性副本替换密钥:
this.hashmap.entrySet()
.stream()
.collect(Collectors.toMap(e -> createCopy(e.getKey()), Map.Entry::getValue))
如果您还需要复制值,可以通过类似的功能运行它们:
ArrayList<AbstractCommand> copyList(ArrayList<AbstractCommand> list) {
return list.stream()
.map(c -> copyCommand(c))
.collect(Collectors.toCollection(ArrayList::new));
}