Interseção de duas listas em Java

Interseção de duas listas em Java

1. Visão geral

Neste tutorial, aprenderemos como recuperar a interseção de doisLists.

Como muitas outras coisas, isso se tornou muito mais fácil graças à introdução destreams in Java 8.

2. Intersecção de duas listas de cordas

Vamos criar doisLists deStrings com alguma interseção - ambos com alguns elementos duplicados:

List list = Arrays.asList("red", "blue", "blue", "green", "red");
List otherList = Arrays.asList("red", "green", "green", "yellow");

E agorawe’ll determine the intersection of the lists with the help of stream methods:

Set result = list.stream()
  .distinct()
  .filter(otherList::contains)
  .collect(Collectors.toSet());

Set commonElements = new HashSet(Arrays.asList("red", "green"));

Assert.assertEquals(commonElements, result);

Primeiro, removemos os elementos duplicados comdistinct. Em seguida, usamosfilter para selecionar os elementos que também estão contidos emotherList.

Finalmente, convertemos nossa saída com umCollector. A interseção deve conter cada elemento comum apenas uma vez. A ordem não importa, portanto,toSet é a escolha mais direta, mas também podemos usartoList ou outro método de coletor.

Para mais detalhes, revise nossoguide to Java 8’s Collectors.

3. Interseção de listas de classes personalizadas

E se nossoLists não contiverStrings, mas sim instâncias de uma classe personalizada que criamos? Bem, contanto que sigamos as convenções de Java, a solução com métodos de fluxo funcionará bem para nossa classe personalizada.

Como o métodocontains decide se um objeto específico aparece em uma lista? Com base no métodoequals. Portanto, temos que substituir o métodoequals e ter certeza de que ele compara dois objetos com base nos valores das propriedades relevantes.

Por exemplo, dois retângulos são iguais se suas larguras e alturas forem iguais.

Se não substituirmos o métodoequals, nossa classe usará a implementaçãoequals da classe pai. No final do dia, ou melhor, na cadeia de herança, o métodoequals da classeObject é executado. Em seguida, duas instâncias são iguais apenas se se referirem exatamente ao mesmo objeto no heap.

Para obter mais informações sobre o métodoequals, consulte nosso artigo emJava equals() and hashCode() Contracts.

4. Conclusão

Neste artigo rápido, vimos como usar fluxos para calcular a interseção de duas listas. Existem muitas outras operações que costumavam ser bastante entediantes, mas são bem diretas se conhecermos o caminho da API Java Stream. Dê uma olhada em nossofurther tutorials with Java streams here.

Os exemplos de código estão disponíveisover on GitHub.