Клонирование списка, карты или набора в Dart
исходя из фона Java: каков рекомендуемый способ "клонирования" дротика List
, Map
и Set
?
3 ответов
использование 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;
можно использовать .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 Я. Блоха, "Эффективная Java" 2-е изд. Пункт 11.
2Б. Веннерс, "Джош блох о дизайне: конструктор копирования против клонирования", 2002. Ссылка отсюда3. Цитата из статьи:
если вы читали статью о клонировании в моей книге, особенно если Вы читаете между строк, вы знаете, что я думаю, что клон глубоко сломан. --- Джей Блох!--34-->
данный ответ хорош, но имейте в виду 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));
но могут быть некоторые проблемы с производительностью.