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.