Copie um mapa superficial e profundo no Dart

Tempo de leitura: 3 minutes

Dart oferece suporte ao tipo de informação de mapa. Você pode copiar um mapa para outro utilizando estratégias diferentes. Existem dois tipos de cópia, cópia superficial e cópia profunda. Antes de escolher como copiar um mapa, é importante compreender a distinção entre os dois.

Este artigo explorará a cópia superficial e profunda de um mapa no Dart. Executaremos um programa de demonstração e talvez eu queira lhe dizer como copiar um mapa no Dart e explicar a diferença entre cópia superficial e cópia profunda em seus aplicativos.

 

Cópia superficial:

Uma cópia superficial significa que o objeto principal que é o Mapa é copiado, porém os objetos internos (os componentes) não são. Um objeto pode ser mutável ou imutável.

Se o componente for imutável e você alterar o valor, o Dart não poderá ajustá-lo e outro objeto com uma área de memória alternativa será criado.

Portanto, o uso de cópia superficial deve ser protegido se o tipo de componente do mapa for imutável, como String, bool, int ou bool. A seguir estão exemplos de cópias superficiais utilizando as estratégias do Dart.

Usando Map.of:

A técnica de fábrica Map.of pode ser utilizada para copiar um mapa para outro.

factory Map.of(Map<K, V> other)

Demo:

var values = <int, String>{
    1: 'red',
    2: 'green',
    3: 'blue',
  };
  var newValues = Map.of(values);

Usando Map.from:

Esta técnica é como Map.of, no entanto, você pode utilizá-la para produzir outro Map cuja chave e tipo de componente seja um subtipo da chave de origem ou tipo de componente.

factory Map.from(Map other)

É utilizado fazer outro mapa com tipos exatos adicionais. Você precisa garantir que todas as chaves e valores tenham tipos mais exatos.

Demo:

var values = <num, String>{
    1: 'red',
    2: 'green',
    3: 'blue',
  };
  Map<int, String> newValues = Map.from(values);

Usando Map.unmodifiable:

Se você deseja copiar para um mapa que não pode ser modificado, você pode usar o método de fábrica Map.unmodifiable.

factory Map.unmodifiable(Map<dynamic, dynamic> other)

Demo:

var types = Map.unmodifiable({
    1: 'red',
    2: 'green',
    3: 'blue',
  });

 

Cópia profunda:

Embora a cópia superficial funcione para um mapa com componentes imutáveis, talvez seja necessário envolver uma cópia profunda para um mapa com componentes mutáveis. Utilizando os modelos acima, assumindo que o componente seja mutável, o Dart irá apenas copiar a referência para o objeto.

O objeto real não é copiado. Conseqüentemente, supondo que você altere um componente da fonte, isso também influencia o elemento do novo Mapa. Na eventualidade de você não querer esse comportamento, você precisa clonar cada componente criando outro objeto.

Para demonstração, temos um Mapa cujo tipo de componente é Item. Para fazer outro objeto Item a partir de um objeto atual, podemos fazer um clone da técnica de fábrica.

class Item {
    String name;
  
    Item({
      required this.name,
    });
  
    factory Item.clone(Item source) {
      return Item(
        name: source.name,
      );
    }
  }

Para clonar um objeto no Dart, você pode implementar um método clone na classe. No exemplo fornecido, a classe Item possui um clone do método de fábrica que cria uma nova instância de Item copiando o atributo name do objeto de origem. Este é um exemplo básico de cópia profunda no Dart, garantindo que uma nova instância com os mesmos valores de atributos seja criada. Para opções de clonagem mais avançadas, você pode explorar métodos como copyWith ou usar a biblioteca dart:convert

Desse ponto em diante, use mapear a técnica para mapear cada componente. Você deseja retornar um MapEntry e utilizar a estratégia de clonagem acima para copiar o objeto mutável.

var item1 = Item(name: 'red');
var item2 = Item(name: 'green');
Map<int, Item> source = {1: item1, 2: item2};
var clone = source.map((key, value) => MapEntry(key, Item.clone(value)));
item1.name = 'green';
print(source[1]?.name); // Green
print(clone[1]?.name); // Red

 

Conclusão

No artigo, expliquei a cópia superficial e profunda de um mapa no Dart; você pode modificar este código de acordo com sua escolha. Esta foi uma pequena introdução à interação do usuário Copie um mapa superficial e profundo no Dart da minha parte, e está funcionando usando Flutter.

É assim que se copia um mapa no Dart. Se o Mapa apenas retém valores de chave e componentes imutáveis, valores superficiais devem ser suficientes. Se a chave ou o valor tiver componentes mutáveis, talvez seja necessário realizar uma cópia profunda.

Espero que este blog forneça informações suficientes sobre como experimentar a cópia superficial e profunda de um mapa no Dart de seus projetos. Então, por favor, experimente.