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

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.