1. Información general
En este tutorial, aprenderemos cómo recuperar la intersección de dos List s.
Como muchas otras cosas, esto se ha vuelto mucho más fácil gracias a la introducción de flujos en Java 8.
2. Intersección de dos listas de cadenas
Creemos dos listas de cadenas con alguna intersección, ambas con algunos elementos duplicados:
List list = Arrays.asList("red", "blue", "blue", "green", "red"); List otherList = Arrays.asList("red", "green", "green", "yellow");
Y ahora determinaremos la intersección de las listas con la ayuda de métodos de flujo :
Set result = list.stream() .distinct() .filter(otherList::contains) .collect(Collectors.toSet()); Set commonElements = new HashSet(Arrays.asList("red", "green")); Assert.assertEquals(commonElements, result);
Primero, eliminamos los elementos duplicados con distintos . Luego, usamos el filtro para seleccionar los elementos que también están contenidos en la otherList .
Finalmente, convertimos nuestra salida con un Collector . La intersección debe contener cada elemento común solo una vez. El orden no debería importar, por lo que toSet es la opción más sencilla, pero también podemos usar toList u otro método de recopilación.
Para obtener más detalles, consulte nuestra guía de recopiladores de Java 8.
3. Intersección de listas de clases personalizadas
¿Qué pasa si nuestras listas no contienen cadenas sino instancias de una clase personalizada que hemos creado? Bueno, siempre que sigamos las convenciones de Java, la solución con métodos de flujo funcionará bien para nuestra clase personalizada.
¿Cómo decide el método contains si un objeto específico aparece en una lista? Basado en el método de iguales . Por lo tanto, tenemos que anular el método equals y asegurarnos de que compara dos objetos en función de los valores de las propiedades relevantes.
Por ejemplo, dos rectángulos son iguales si sus anchos y alturas son iguales.
Si no anulamos el método equals , nuestra clase usa la implementación equals de la clase padre. Al final del día, o más bien, la cadena de herencia, se ejecuta el método igual de la clase Object . Entonces, dos instancias son iguales solo si se refieren exactamente al mismo objeto en el montón.
Para obtener más información sobre el método equals , consulte nuestro artículo sobre contratos Java equals () y hashCode () .
4. Conclusión
En este artículo rápido, hemos visto cómo usar flujos para calcular la intersección de dos listas. Hay muchas otras operaciones que solían ser bastante tediosas pero que son bastante sencillas si conocemos la API de Java Stream. Eche un vistazo a nuestros tutoriales adicionales con secuencias de Java aquí.
Los ejemplos de código están disponibles en GitHub.