返回HashMap的新实例

时间:2018-04-03 01:24:22

标签: java linkedhashmap

我有一个存储自定义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?还是有更清洁的方式?

1 个答案:

答案 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));
}