从Java背景的:什么是“克隆”一个飞镖是推荐的方式List
,Map
和Set
?
Answers:
1,2clone()
在Java中的使用非常棘手且值得商question 。实际上,是拷贝构造函数和针对的飞镖,和类型都有一个名为constructor名为执行一个浅拷贝; 例如,鉴于这些声明clone()
List
Map
Set
.from()
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
。
为了完整起见,我应该提到dart:html
Node
该类定义了clone()方法。
1 J. Bloch,“有效的Java ”,第二版,第11条
。2 B. Venners,“ Josh Bloch谈设计:复制构造器与克隆”,2002年。从这里引用3。从文章引用:
如果您已经阅读了我书中有关克隆的内容,尤其是您在两行之间阅读的话,您会知道我认为克隆已被严重打破。---布洛克
.from()
是一个浅表副本构造函数。明确地说,我从未说过.from()
执行克隆操作。我写的clone()
是一种复制构造函数。
List
,List<E>.of()
可能会更好。
使用新版本的飞镖,克隆地图或列表变得非常容易。您可以尝试使用此方法对List和Map进行深层克隆。
清单
List a = ['x','y', 'z'];
List b = [...a];
对于地图
Map mapA = {"a":"b"};
Map mapB = {...mapA};
对于集合
Set setA = {1,2,3,};
Set setB = {...setA};
我希望有人能对此有所帮助。
对于深度复制(克隆),可以使用:
Map<String, dynamic> src = {'a': 123, 'b': 456};
Map<String, dynamic> copy = json.decode(json.encode(src));
但是可能会对性能有所担心。
Map.from()仅适用于一维地图。
若要在飞镖中复制没有参考的多维地图,请使用以下方法
Map<keyType, valueType> copyDeepMap( Map<keyType, valueType> map )
{
Map<keyType, valueType> newMap = {};
map.forEach
(
(key, value)
{
newMap[key] =( value is Map ) ? copyDeepMap(value) : value ;
}
);
return newMap;
}
复制Map <String,List>过滤;
var filteredNewCopy = filtered.map((key, value) => MapEntry(key, [...value]));
给定的答案很好,但是请注意generate
构造器,如果您要“增长”固定长度的列表,这将很有帮助,例如:
List<String> list = new List<String>(5);
int depth = 0; // a variable to track what index we're using
...
depth++;
if (list.length <= depth) {
list = new List<String>.generate(depth * 2,
(int index) => index < depth ? list[index] : null,
growable: false);
}