在Dart中克隆列表,地图或集

问题描述 投票:21回答:5

来自Java背景:什么是“克隆”Dart qazxsw poi,qazxsw poi和qazxsw poi的推荐方法?

collections dart clone
5个回答
39
投票

在Java中使用List是棘手而有问题的1,2。实际上,Map是一个复制构造函数,为此,Dart Setclone()clone()类型都有一个List,名为Map,执行Set;例如鉴于这些声明

named constructor

你可以像这样使用.from()

shallow copy

请注意, Map<String, int> numMoons, moreMoons; numMoons = const <String,int>{ 'Mars' : 2, 'Jupiter' : 27 }; List<String> planets, morePlanets; 更通常接受迭代器而不仅仅是.from()

为了完整起见,我应该提到 moreMoons = new Map<String,int>.from(numMoons) ..addAll({'Saturn' : 53 }); planets = new List<String>.from(numMoons.keys); morePlanets = new List<String>.from(planets) ..add('Pluto'); List.from()类定义了List方法。


1 J. Bloch,“Effective Java”第2版,第11项。 2 dart:html。从这里引用3。从文章引用:

如果您已经阅读了我的书中有关克隆的项目,特别是如果您在这些内容之间进行了阅读,您将会知道我认为克隆已经深受打击。 --- J.Bloch

3 Node


5
投票

对于列表和集合,我通常使用

clone()

正如@kzhdev所提到的那样,需要注意的是B. Venners, "Josh Bloch on Design: Copy Constructor versus Cloning", 2002Dart Issue #6459, clone instance(object)

[不]真正做出克隆。他们在新的Map / List / Set中添加引用。

这通常对我很好,但我会记住它。


2
投票

该解决方案应该工作:

清单list1 = [1,2,3,4];

列表list2 = list1.map((element)=> element).toList();

这是一个列表,但应该对地图等工作相同,记得添加到列表,如果它最后是一个列表


0
投票

给出的答案是好的,但要注意List<String> clone = []..addAll(originalList); 构造函数,如果你想“增长”固定长度列表,例如:

addAll()

-2
投票

对于深层复制(克隆),您可以使用:

from()

但可能会对性能产生一些担忧。

© www.soinside.com 2019 - 2024. All rights reserved.