来自Java背景:什么是“克隆”Dart qazxsw poi,qazxsw poi和qazxsw poi的推荐方法?
在Java中使用List
是棘手而有问题的1,2。实际上,Map
是一个复制构造函数,为此,Dart Set
,clone()
和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
。
对于列表和集合,我通常使用
clone()
正如@kzhdev所提到的那样,需要注意的是B. Venners, "Josh Bloch on Design: Copy Constructor versus Cloning", 2002和Dart Issue #6459, clone instance(object)
[不]真正做出克隆。他们在新的Map / List / Set中添加引用。
这通常对我很好,但我会记住它。
该解决方案应该工作:
清单list1 = [1,2,3,4];
列表list2 = list1.map((element)=> element).toList();
这是一个列表,但应该对地图等工作相同,记得添加到列表,如果它最后是一个列表
给出的答案是好的,但要注意List<String> clone = []..addAll(originalList);
构造函数,如果你想“增长”固定长度列表,例如:
addAll()
对于深层复制(克隆),您可以使用:
from()
但可能会对性能产生一些担忧。