Javaバックグラウンドから来る:Dart List
、Map
およびSet
を「クローン」するための推奨される方法は何ですか?
Java=でのclone()
の使用はトリッキーで疑わしい1,2。事実上、clone()
はコピーコンストラクターであり、そのために、Dart 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、「Effective Java」第2版、アイテム11。
2 B。 Venners、「Josh Bloch on Design:Copy Constructor vs Cloning」、2002 。ここから参照3。記事からの引用:
私の本でクローンについての項目を読んだ場合、特に行間を読んだ場合、クローンが深く壊れていると思います。 --- J.Bloch
リストとセットの場合、私は通常、
_List<String> clone = []..addAll(originalList);
_
@kzhdevが言及しているように、警告はaddAll()
およびfrom()
です。
実際にはクローンを作成しないでください。新しいマップ/リスト/セットに参照を追加します。
通常は問題ありませんが、覚えておきます。
このソリューションは機能するはずです。
リストlist1 = [1,2,3,4];
リストlist2 = list1.map((element)=> element).toList();
リスト用ですが、マップなどでも同じように機能するはずです。最後にリストがある場合は、リストに追加してください。
Map.from()多次元マップの1Dマップでのみ機能します
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;
}
与えられた答えは良いですが、固定長のリストを「拡張」したい場合に役立つ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);
}
ディープコピー(クローン)の場合、次を使用できます。
Map<String, dynamic> src = {'a': 123, 'b': 456};
Map<String, dynamic> copy = json.decode(json.encode(src));
ただし、パフォーマンスについて懸念がある場合があります。
私にとって最適なソリューションList temp = {1,2,3,4} List platforms = json.decode(json.encode(parent.platforms));