Dart - Operador Spread ( . . .)

 Hoje vou apresentar o operador Spred da linguagem Dart.

DART(tradução: dardo, pequeno míssel) é a linguagem da Google usada pelo Flutter.

O Flutter é um SDK de aplicativo móvel do Google que ajuda a criar aplicativos móveis modernos para iOS e Android usando uma única (quase) base de código.

Se você não conhece o Flutter veja o meu artigo :  Flutter - Primeiros contatos e impressões

O objetivo dos artigos sobre o DART é abordar recursos específicos da linguagem que são uma característica do DART de forma a ajudar programadores C# a entender esses recursos.

Você pode testar os códigos usados neste artigo no DartPad:  https://dartpad.dev/

Apresentando o operador Spread

O operador Spread é representado por 3 pontos ( . . . ) e pode ser usado para estender os elementos de uma coleção e também para concatenar coleções.

Vejamos o seu uso com a coleção List:

void main() {
  
      List<int> lista1 = [1, 2, 3]; 

      List<int> lista2 = [...lista1 ]; 
     List<int> lista3 = [0,...lista2];

      print("lista2 = " + lista2.toString());
      print("lista3 = " + lista3.toString());
}
 
lista2 = [1, 2, 3]

lista3 = [0, 1, 2, 3]

Podemos verificar se a lista da direita possui um valor null usando o operador null-aware spread (...?):

void main() {
  
      List<int> lista1 = [4, 5, 6]; 
      List<int> lista2 = [1, 2, 3, ...lista1 ]; 
     List<int> lista3 = [...?lista2];

      print("lista2 = " + lista2.toString());
      print("lista3 = " + lista3.toString());
}
 
lista2 = [1, 2, 3, 4, 5, 6]

lista3 = [1, 2, 3, 4, 5, 6]

Podemos usar o operador spread para combinar duas listas :

void main() {  
      List<int> lista1 = [1, 2, 3];
     List<int> lista2 = [4, 5, 6, 7];

     List<int> resultado = [...lista1, ...lista2];

     print(resultado);
}
[1, 2, 3, 4, 5, 6, 7]

Podemos também realizar concatenações aninhadas usando o operador spread:

void main() {

  List<int> lista1 = [1, 2, 3]; 
  List<int> lista2 = [4, 5 ];
 
  List<int> resultado = [...[0, ...lista1, ...lista2], 6];
  print("resultado = " + resultado.toString());
}
resultado = [0, 1, 2, 3, 4, 5, 6]

Podemos ainda usar uma condição if para determinar se a lista poderá ser concatenada ou não:

void main() {
  
  List<int> lista1 = [1, 2, 3]; 
  List<int> lista2 = [4, 5, 6];  
  bool condicao = false;	
  List<int> resultado1 = [...lista1, if (condicao) ...lista2];
  List<int> resultado2 = [...lista1, if (!condicao) ...lista2];	
  print(resultado1);
  print(resultado2);
}
[1, 2, 3]

[1, 2, 3, 4, 5, 6]

O operador spread também pode ser usado com a classe Set<E>.

Nota:  A classe Set<E> representa uma coleção de objetos na qual cada objeto pode ocorrer somente uma vez.

void main() {  
  Set<int> s1 = {1, 2, 3};	
  Set<int> s2 = {3, 4, 5};	
  Set<int> resultado = {...s1, ...s2};	
  print(resultado);
}

 

{1, 2, 3, 4, 5}

O operador spread também pode ser usado com a classe Map<K,V>.

Nota:  A classe Map<K,V> representa uma coleção de pares chave/valor, a partir da qual podemos retornar valores usando a chave associada.

void main() {

  Map<int, String> map1 = {1: 'Paulo', 2: 'Maria'};
  Map<int, String> map2 = {2: 'Pedro', 3: 'Ana'};	
  Map<int, String> resultado = {...map1, ...map2};
  print(resultado);
}
{1: Paulo, 2: Pedro, 3: Ana}

 

Assim o operador spread (. . .) torna mais fácil realizar a combinação de coleções tornando o código mais limpo.
 

"E Jesus lhe disse: Ninguém, que lança mão do arado e olha para trás, é apto para o reino de Deus."
Lucas 9:62

 


Referências:


José Carlos Macoratti