Manipulando listas com #Dart. (#dev #flutter)

Aqui estão alguns exemplos de funções úteis para manipularmos listas com Dart.

 

A lista abaixo será utilizada nos outros exemplos

var mainList = [6,7,8,9,10, "bacon", "foo", "bar", 11, 12, 13];
print('Original list: $mainList');

 

 

Adicionando um item a lista

var mainList2 = [...mainList];
mainList2.add(42);
print('List with new element: $mainList2');

 

 

Verificando o tamanho da lista

print('Elements in list: ${mainList.length}');

 

 

Verificando se a lista está vazia

print('Is list empty?: ${mainList.isEmpty}');

 

 

Verificando se a lista possui algum item

print('List contains any elements?: ${mainList.isNotEmpty}');

 

 

Recuperando o primeiro elemento da lista

print('First Element: ${mainList.first}');

 

 

Recuperando o ultimo elemento da lista

print('Last Element: ${mainList.last}');

 

 

Limpando (apagando) todos os elementos da lista

var clearList = [...mainList];
clearList.clear();
print('Erased list: $clearList');

 

 

Invertendo a lista

var reversedList = [...mainList].reversed.toList();
print('Reversed list: $reversedList');

 

 

Colocando os elementos da lista em ordem aleatória

var shuffledList = [...mainList];
shuffledList.shuffle();  
print('Shuffled list: $shuffledList');

 

Convertendo a lista em mapa

var listAsMap =  [...mainList].asMap();
print('List as map: $listAsMap');

 

 

Filtrando elementos da lista por tipo de variável

var onlyInt =  [...mainList].whereType<int>().toList();
var onlyStr =  [...mainList].whereType<String>().toList();
print('Only INT: $onlyInt');
print('Only STRING: $onlyStr');

 

 

Extraindo uma “fatia” da lista

var startRange = 3;
var endRange = 6;
var slicedList = [...mainList].getRange(startRange, endRange);  
print('Sliced List: $slicedList');

A função getRange recebe o índice do primeiro elemento e o índice do ultimo. Porém o item do último item nao entra na fatia, ou seja, o inicio é inclusive, mas o final não.

 

 

Substituindo uma fatia da lista

var startReplaceRange = 3;
var endReplaceRange = 6;
var sliceReplacedList = [...mainList];
sliceReplacedList.replaceRange(startReplaceRange, endReplaceRange, ["X", "Y", "Z", "AA"]);    
print('Slice replaced List: $sliceReplacedList');

Assim com o a função getRange, a replaceRange recebe o indice do primeiro item (inclusivo) e o do ultimo. O terceiro argumento é o que vai ser inserido no lugar dos elementos que serão removidos.

 

 

Encontrando primeiro item que atende um critério definido

var resultFirstWhere = [...onlyInt].firstWhere((el) => el % 2 == 0);
print('First even number: $resultFirstWhere');

Aqui você define um critério ou informa alguma função que retorne um booleano e ele vai aplicar isso a cada um dos itens da lista. O primeiro item receber true, será retornado.

Se a lista estiver vazia ou se nenhum item for encontrado, a função retorna um erro.

 

 

Encontrando último item que atende um critério definido

var resultLastWhere = [...onlyInt].lastWhere((el) => el % 2 == 0);
print('Last even number: $resultLastWhere');

Este método funciona de uma forma parecida ao firstWhere, mas ele busca o útimo item que atende o critério informado.

 

 

Encontrando um elemento único que atenda o critério definido

var resultSingleWhere = [...onlyInt].singleWhere((el) => el == 10);
print('Element equals to 10: $resultSingleWhere');

Este método funciona de uma forma similar aos dois anteriores, mas se existir mais de 1 elemento que atende ao critério, será retornado um erro.

 

 

Verificando se algum elemento atende o critério definido

var containsBacon = [...mainList].any((el) => el == 'bacon');
print('List contain bacon? $containsBacon');

 

 

Verificando se todos os elementos atendem o critério definido

var allElementsAreBacon = [...mainList].every((el) => el == 'bacon');
print('List contains only bacon? $allElementsAreBacon');

 

 

Retornando a soma de todos os elementos da lista

var initialValue = 0;
var sumAllElements = [...onlyInt].fold(initialValue, (accumulated, element) => accumulated + element);
print("Sum of all elements: $sumAllElements");

A função fold recebe o valor inicial (initialValue) e depois uma função com dois argumentos, o primeiro é o valor acumulado e o segundo é o elemento da lista.  Na primeira iteração, o valor acumulado é igual ao valor inicial.

 

 

Retornando a soma de todos os elementos da lista (reduce)

var reducedList = [...onlyInt].reduce((accumulated, element) => accumulated + element);
print("Another sum of all elements: $reducedList");

Esta função trabalha de uma forma muito parecida com a anterior, porem nao recebe um valor inicial.

 

 

Juntando duas listas

var mergedList = [...onlyInt].followedBy([42, 43, 44, 45]).toList();
print('Merged lists: $mergedList');

Esta função vai fazer um merge das duas listas, mas os elementos de cada lista precisam ser do mesmo tipo.

 

 

Pegando os N primeiros itens da lista

var took3 = [...mainList].take(3).toList();
print('First 3 elements: $took3');

 

 

Pulando os N primeiros itens da lista

var skipped2 = [...mainList].skip(2).toList();
print('List without the first 2 elements: $skipped2');

 

 

Transformando a lista

var mappedList = [...mainList].map((element) => 'El: $element').toList();
print('Transformed list: $mappedList');

O método map recebe uma funcao que tem uma argumento. Nele você pode fazer o que precisar e o que voce retornar será considerado como um elemento da nova lista. Você pode utilizar o map para transformar a lista de um tipo de objetos em outro.

 

 

Ordenando uma lista

var ascSortedList = [...onlyInt.reversed];
print('Unsorted list: $ascSortedList');
ascSortedList.sort();
print('Srted list: $ascSortedList');

Se nenhuma função for passada para o método sort, o Dart tentará ordenar a lista de forma crescente.

 

 

Orgenando uma lista 2

var sortedList = [...mainList];
print('Unsorted list2: $sortedList');
sortedList.sort((a, b) => a.runtimeType == int? -1 : 1);
print('Sorted list2: $sortedList');

Neste post expliquei como fazer a ordenação de uma lista utilizando esta função.

 

 

 

Se quiser, coloquei estes exemplos no meu Github.

Espero ter ajudado.

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dart/Flutter, Dev and tagged , , , , .