Pat*_*lin 48
clone()在Java中的使用是棘手和可疑的1,2.实际上,clone()是拷贝构造函数和针对的飞镖List,Map和Set类型都有一个名为constructor名为.from()执行一个浅拷贝 ; 例如,给出这些声明
Map<String, int> numMoons, moreMoons;
numMoons = const <String,int>{ 'Mars' : 2, 'Jupiter' : 27 };
List<String> planets, morePlanets;
Run Code Online (Sandbox Code Playgroud)
你可以.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');
Run Code Online (Sandbox Code Playgroud)
请注意,List.from()更通常接受迭代器而不仅仅是a List.
为了完整起见,我应该提到dart:html Node该类定义了一个clone()方法.
1 J. Bloch," Effective Java "第2版,第11项
.2 B. Venners," Josh Bloch on Design:Copy Constructor vs. Cloning ",2002.从这里引用3.从文章引用:
如果您已经阅读了我的书中有关克隆的项目,特别是如果您在这些内容之间进行了阅读,您将会知道我认为克隆已经深受打击.--- J.Bloch
小智 33
如果您使用的是 dart > 2.3.0,则可以使用扩展运算符,例如:
List<int> a = [1,2,3];
List<int> b = [...a]; // copy of a
Run Code Online (Sandbox Code Playgroud)
Shu*_*mar 33
使用新版本的 dart 克隆地图或列表变得非常容易。您可以尝试使用此方法对 List 和 Map 进行深度克隆。
对于列表
List a = ['x','y', 'z'];
List b = [...a];
Run Code Online (Sandbox Code Playgroud)
对于地图
Map mapA = {"a":"b"};
Map mapB = {...mapA};
Run Code Online (Sandbox Code Playgroud)
对于套装
Set setA = {1,2,3,};
Set setB = {...setA};
Run Code Online (Sandbox Code Playgroud)
我希望有人觉得这有帮助。
Nir*_*ane 15
方法一:推荐
要克隆多维(嵌套) List 或 Map,请使用 json.decode() 和 json.encode()
List newList = json.decode(json.encode(oldList));
Map newMap = json.decode(json.encode(oldList));
Run Code Online (Sandbox Code Playgroud)
方法2:
List newList = [...oldList];
Map newMap = {...oldMap}
Run Code Online (Sandbox Code Playgroud)
方法3:
List newList = List.from(oldList);
Map newMap = Map.from(oldMap);
Run Code Online (Sandbox Code Playgroud)
方法4:
List newList = List.of(oldList);
Map newMap = Map.of(oldMap);
Run Code Online (Sandbox Code Playgroud)
方法5:
List newList = List.unmodifiable(oldList);
Map newMap = Map.unmodifiable(oldMap);
Run Code Online (Sandbox Code Playgroud)
更多参考资料:
https://www.kindacode.com/article/how-to-clone-a-list-or-map-in-dart-and-flutter/ https://coflutter.com/dart-flutter-how-to-克隆复制列表/
kar*_*our 11
对于深拷贝(克隆),您可以使用:
Map<String, dynamic> src = {'a': 123, 'b': 456};
Map<String, dynamic> copy = json.decode(json.encode(src));
Run Code Online (Sandbox Code Playgroud)
但可能会有一些对性能的担忧。
对于列表和集合,我通常使用
List<String> clone = []..addAll(originalList);
Run Code Online (Sandbox Code Playgroud)
需要说明的,如@kzhdev提到,是addAll()和from()
[不要]真正地克隆。他们在新的地图/列表/集合中添加参考。
我通常可以,但是我会记住这一点。
小智 7
此解决方案应该有效:
List list1 = [1,2,3,4];
List list2 = list1.map((element)=>element).toList();
Run Code Online (Sandbox Code Playgroud)
它用于列表,但对于地图等应该相同,如果最后是列表,请记住添加到列表
Map.from()仅适用于一维地图。
要在 dart 中不参考地复制多维地图,请使用以下方法
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15572 次 |
| 最近记录: |