Procurando por uma String em um ArrayList

Procurando por uma String em um ArrayList

1. Visão geral

Neste tutorial, examinaremosdifferent ways to search for a String in an ArrayList. Nossa intenção é verificar se uma sequência específica não vazia de caracteres está presente em qualquer um dos elementos emArrayListe retornar uma lista com todos os elementos correspondentes.

2. Loop básico

Primeiro, vamos usar um loop básico para pesquisar a sequência de caracteres na string de pesquisa fornecida usando o métodocontains da classeString de Java:

public List findUsingLoop(String search, List list) {
    List matches = new ArrayList();

    for(String str: list) {
        if (str.contains(search)) {
            matches.add(str);
        }
    }

    return matches;
}

3. Streams

OJava 8 Streams API nos fornece uma solução mais compacta usando operações funcionais.

Primeiro, usaremos o métodofilter() para pesquisar nossa lista de entrada para a string de pesquisa e, em seguida, usaremos o métodocollect para criar e preencher uma lista contendo os elementos correspondentes:

public List findUsingStream(String search, List list) {
    List matchingElements = list.stream()
      .filter(str -> str.trim().contains(search))
      .collect(Collectors.toList());

    return matchingElements;
}

4. Bibliotecas de terceiros

Se não podemos usar a API Java 8 Stream, podemos olhar para bibliotecas de terceiros, como Commons Collections e Google Guava.

Para usá-los, precisamos apenas adicionarGuava,Commons Collections ou ambas as dependências em nosso arquivo pom.xml:


    com.google.guava
    guava
    23.0



    org.apache.commons
    commons-collections4
    4.1

4.1. Colecções Commons

Commons Collections nos fornece um métodoIterableUtils.filteredIterable() que combina o dadoIterable contra umPredicate.

Vamos chamarIterableUtils.filteredIterable(), definindo o predicado para selecionar apenas os elementos que contêm a string de pesquisa. Em seguida, usaremosIteratorUtils.toList() para converterIterable emList:

public List findUsingCommonsCollection(String search, List list) {
    Iterable result = IterableUtils.filteredIterable(list, new Predicate() {
        public boolean evaluate(String listElement) {
            return listElement.contains(search);
        }
    });

    return IteratorUtils.toList(result.iterator());
}

4.2. Google Guava

O Google Guava oferece uma solução semelhante aofilteredIterable() do Apache com o métodoIterables.filter(). Vamos usá-lo para filtrar a lista e retornar apenas os elementos que correspondem à nossa string de pesquisa:

public List findUsingGuava(String search, List list) {
    Iterable result = Iterables.filter(list, Predicates.containsPattern(search));

    return Lists.newArrayList(result.iterator());
}

5. Conclusão

Neste tutorial, aprendemos diferentes maneiras de pesquisar umString em umArrayList.. Começamos primeiro com um loopfor simples e, em seguida, prosseguimos com uma abordagem usando a API Stream. Finalmente, vimos alguns exemplos usando duas bibliotecas de terceiros - Google Guava e Commons Collections.

Os exemplos completos estão disponíveisover on GitHub.