Manipulando listas com #Dart. (#dev #flutter)
Overview
Bem-vindo ao nosso guia prático de manipulação de listas em Dart! Aqui, vamos embarcar em uma jornada cheia de dicas e truques para tornar sua experiência com listas não apenas mais fácil, mas também mais divertida. Desde a adição de novos elementos até complexas operações de filtragem, este é o seu ponto de partida ideal para dominar listas em Dart. Então, prepare-se para desbloquear todo o potencial das suas listas e dar vida às suas ideias de programação!
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.