examples ejemplos and collections dart clone

collections - ejemplos - mongodb aggregate lookup



Clonar una lista, mapa o conjunto en Dart (5)

El uso de clone() en Java es complicado y cuestionable 1,2 . Efectivamente, clone() es un constructor de copia y para eso, los tipos List Dart, Map y Set tienen cada uno un constructor llamado .from() que realiza una copia superficial ; eg dadas estas declaraciones

Map<String, int> numMoons, moreMoons; numMoons = const <String,int>{ ''Mars'' : 2, ''Jupiter'' : 27 }; List<String> planets, morePlanets;

puedes usar .from() así:

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'');

Tenga en cuenta que List.from() generalmente acepta un iterador en lugar de solo una List .

En aras de la exhaustividad, debo mencionar que la clase de Node dart:html define un método clone() .

1 J. Bloch, " Java efectiva ", 2ª ed., Punto 11.
2 B. Venners, " Josh Bloch sobre Diseño: Copia Constructor versus Clonación ", 2002 . Referenciado desde aquí 3 . Cita del artículo:

Si ha leído el artículo sobre la clonación en mi libro, especialmente si lee entre líneas, sabrá que creo que el clon está profundamente dañado. --- J.Bloch

3 Dart Issue # 6459, clonar instancia (objeto) .

Procedentes de un fondo de Java: ¿cuál es la forma recomendada de "clonar" una List Dart, un Map y un Set ?


Esta solución debería funcionar:

Lista de lista1 = [1,2,3,4];

List list2 = list1.map ((element) => element) .toList ();

Es para una lista pero debería funcionar igual para un mapa, etc. Recuerde agregar a la lista si es una lista al final.


La respuesta dada es buena, pero tenga en cuenta que el constructor de generate es útil si desea "aumentar" una lista de longitud fija, por ejemplo:

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); }


Para copia profunda (clon), puede utilizar:

Map<String, dynamic> src = {''a'': 123, ''b'': 456}; Map<String, dynamic> copy = json.decode(json.encode(src));

pero puede haber algunas preocupaciones sobre el rendimiento.


Para listas y conjuntos, normalmente uso

List<String> clone = []..addAll(originalList);

La advertencia, como lo menciona @kzhdev, es que addAll() y from()

[No] realmente hacer un clon. Añaden una referencia en el nuevo Mapa / Lista / Conjunto.

Eso usualmente está bien conmigo, pero lo tendría en cuenta.