Como encontrar um elemento em uma lista com Java
1. Visão geral
Encontrar um elemento em uma lista é uma tarefa muito comum que encontramos como desenvolvedores.
Neste tutorial rápido, vamos cobrir diferentes maneiras de fazer isso com Java.
Leitura adicional:
Verificando se uma lista é classificada em Java
Aprenda vários algoritmos para verificar se uma lista está classificada em Java.
Inicialização da lista Java em uma linha
Neste tutorial rápido, vamos investigar como podemos inicializar uma lista usando one-liners.
2. Configuração
Vamos começar definindo um POJOCustomer:
public class Customer {
private int id;
private String name;
// getters/setters, custom hashcode/equals
}
E umArrayList de clientes:
List customers = new ArrayList<>();
customers.add(new Customer(1, "Jack"));
customers.add(new Customer(2, "James"));
customers.add(new Customer(3, "Kelly"));
Observe que substituímoshashCode eequals em nossa classeCustomer.
Com base em nossa implementação atual deequals, dois objetosCustomer com o mesmoid serão considerados iguais.
Usaremos esta lista decustomers ao longo do caminho.
3. Usando API Java
O próprio Java fornece várias maneiras de localizar um item em uma lista:
-
O métodocontains
-
O métodoindexOf
-
An ad-hoc for loop, e
-
OStream API
3.1. contains()
List expõe um método chamadocontains:
boolean contains(Object element)
Como o nome sugere, este método retornatrue se a lista contém oelement, especificado e retornafalse caso contrário.
Portanto, quando precisamos apenas verificar se existe um item específico em nossa lista, podemos:
Customer james = new Customer(2, "James");
if (customers.contains(james)) {
// ...
}
3.2. indexOf()
indexOf é outro método útil para encontrar elementos:
int indexOf(Object element)
Este método retorna o índice da primeira ocorrência doelement especificado na lista fornecida, ou -1 se a lista não contém oelement.
Portanto, logicamente, se esse método retornar algo diferente de -1, sabemos que a lista contém o elemento:
if(customers.indexOf(james) != -1) {
// ...
}
A principal vantagem de usar esse método é que ele pode nos dizer a posição do elemento especificado na lista fornecida.
3.3. Loop básico
Mas e se quisermos fazer uma pesquisa baseada em campo para um elemento? Digamos que estejamos anunciando uma loteria e precisemos declarar umCustomer com umname específico como o vencedor.
Para essas pesquisas baseadas em campo, podemos recorrer à iteração.
Uma maneira tradicional de iterar em uma lista é usar uma das construçõesJava’s looping. Em cada iteração, comparamos o item atual na lista com o elemento que estamos procurando para ver se é uma correspondência:
public Customer findUsingEnhancedForLoop(
String name, List customers) {
for (Customer customer : customers) {
if (customer.getName().equals(name)) {
return customer;
}
}
return null;
}
Aqui,name refere-se ao nome que estamos procurando na lista fornecida decustomers. Este método retorna o primeiro objetoCustomer na lista com umname correspondente, enull se não existir talCustomer.
3.4. Loop com umIterator
Iterator é outra maneira de percorrer uma lista de itens.
Podemos simplesmente pegar nosso exemplo anterior e ajustá-lo um pouco:
public Customer findUsingIterator(
String name, List customers) {
Iterator iterator = customers.iterator();
while (iterator.hasNext()) {
Customer customer = iterator.next();
if (customer.getName().equals(name)) {
return customer;
}
}
return null;
}
E o comportamento é o mesmo de antes.
3.5. API Java 8Stream
No Java 8, também podemosuse the Stream API para encontrar um elemento em umList.
Para encontrar um elemento que corresponda a critérios específicos em uma determinada lista, nós:
-
invocarstream() na lista
-
chame o métodofilter() com umPredicate adequado
-
chame ofindAny() construct que retornathe first element that matches the filter predicate wrapped in an Optional se tal elemento existir **
Customer james = customers.stream()
.filter(customer -> "James".equals(customer.getName()))
.findAny()
.orElse(null);
Por conveniência, o padrão énull no caso de umOptional estar vazio, mas isso pode nem sempre ser a melhor escolha para todos os cenários.
4. Bibliotecas de terceiros
Agora, embora a API Stream seja mais do que suficiente,what should we do if we’re stuck on an earlier version of Java?
Felizmente, existem muitas bibliotecas de terceiros, como Google Guava e Apache Commons, que podemos usar.
4.1. Google Guava
O Google Guava fornece funcionalidade semelhante ao que podemos fazer com fluxos:
Customer james = Iterables.tryFind(customers,
new Predicate() {
public boolean apply(Customer customer) {
return "James".equals(customer.getName());
}
}).orNull();
Como podemos com a APIStream, podemos opcionalmente escolher retornar um valor padrão em vez denull:
Customer james = Iterables.tryFind(customers,
new Predicate() {
public boolean apply(Customer customer) {
return "James".equals(customer.getName());
}
}).or(customers.get(0));
O código acima selecionará o primeiro elemento da lista se nenhuma correspondência for encontrada.
E não se esqueça de que Guava lança umNullPointerException se a lista ou o predicado fornull.
4.2. Apache Commons
Podemos encontrar um elemento quase da mesma maneira usando o Apache Commons:
Customer james = IterableUtils.find(customers,
new Predicate() {
public boolean evaluate(Customer customer) {
return "James".equals(customer.getName());
}
});
Existem algumas diferenças importantes, no entanto:
-
Apache Commons apenas retornanull se passarmos uma listanull
-
Ele não fornece funcionalidade de valor padrão comotryFind do Guava
5. Conclusão
Neste artigo, aprendemos diferentes maneiras de encontrar um elemento emList, s, começando com verificações rápidas de existência e terminando com pesquisas baseadas em campo.
Também observamos as bibliotecas de terceirosGoogle GuavaeApache Commons como alternativas para a API Java 8Streams.
Obrigado pela visita e lembre-se de verificar todas as fontes desses exemplosover on GitHub.