1. Información general
En este artículo rápido, discutimos el concepto de programación altamente útil conocido como Par . Los pares proporcionan una forma conveniente de manejar la asociación simple de clave a valor y son particularmente útiles cuando queremos devolver dos valores de un método.
Una implementación simple de un par está disponible en las bibliotecas centrales de Java. Más allá de eso, ciertas bibliotecas de terceros como Apache Commons y Vavr han expuesto esta funcionalidad en sus respectivas API.
2. Implementación básica de Java
2.1. La clase de pareja
La clase Pair se puede encontrar en el paquete javafx.util . El constructor de esta clase toma dos argumentos, una clave y su valor correspondiente:
Pair pair = new Pair(1, "One"); Integer key = pair.getKey(); String value = pair.getValue();
Este ejemplo ilustra un mapeo simple de Entero a Cadena usando el concepto de Par.
Como se muestra, la clave en el objeto de par se recupera invocando un método getKey () mientras que el valor se recupera llamando a getValue ().
2.2. AbstractMap.SimpleEntry y AbstractMap.SimpleImmutableEntry
SimpleEntry se define como una clase anidada dentro de la clase AbstractMap . Para crear un objeto de este tipo podemos proporcionar una clave y un valor al constructor:
AbstractMap.SimpleEntry entry = new AbstractMap.SimpleEntry(1, "one"); Integer key = entry.getKey(); String value = entry.getValue();
Se puede acceder a la clave y el valor a través de métodos estándar de obtención y definición.
Además, la clase AbstractMap también contiene una clase anidada que representa un par inmutable: la clase SimpleImmutableEntry :
AbstractMap.SimpleImmutableEntry entry = new AbstractMap.SimpleImmutableEntry(1, "one");
Esto funciona de manera similar a la clase de par mutable, excepto que el valor del par no se puede cambiar. Intentar hacerlo resultará en una UnsupportedOperationException .
3. Apache Commons
En la biblioteca de Apache Commons, podemos encontrar la clase Pair en el paquete org.apache.commons.lang3.tuple . Esta es una clase abstracta, por lo que no se puede instanciar directamente.
Aquí podemos encontrar dos subclases, que representan pares inmutables y mutables: Imm utablePair y MutablePair.
Ambas implementaciones tienen acceso a métodos de obtención / definición de clave / valor:
ImmutablePair pair = new ImmutablePair(2, "Two"); Integer key = pair.getKey(); String value = pair.getValue();
Como era de esperar, un intento de invocar setValue () en ImmutablePair da como resultado una UnsupportedOperationException.
Pero la operación es completamente válida para una implementación mutable:
Pair pair = new MutablePair(3, "Three"); pair.setValue("New Three");
4. Vavr
En la biblioteca Vavr, la funcionalidad de par la proporciona la clase inmutable Tuple2 :
Tuple2 pair = new Tuple2(4, "Four"); Integer key = pair._1(); String value = pair._2();
En esta implementación, no podemos modificar el objeto después de la creación, por lo que los métodos mutantes están devolviendo una nueva instancia que incluye el cambio proporcionado:
tuplePair = pair.update2("New Four");
5. Alternativa I - Clase de contenedor simple
Ya sea por preferencia del usuario o en ausencia de cualquiera de las bibliotecas antes mencionadas, una solución estándar para la funcionalidad de par es crear una clase de contenedor simple que envuelva los valores de retorno deseados.
La mayor ventaja aquí es la capacidad de proporcionar nuestro nombre, lo que ayuda a evitar que la misma clase represente diferentes objetos de dominio:
public class CustomPair { private String key; private String value; // standard getters and setters }
6. Alternativa II - Matrices
Otra solución alternativa común es usar una matriz simple con dos elementos para lograr resultados similares:
private Object[] getPair() { // ... return new Object[] {key, value}; }
Normalmente, la clave se encuentra en el índice cero de la matriz, mientras que su valor correspondiente se encuentra en el índice uno.
7. Conclusión
En este tutorial, hemos discutido el concepto de pares en Java y las diferentes implementaciones disponibles en el núcleo de Java, así como en otras bibliotecas de terceros.
Como siempre, puede encontrar el código que respalda este tutorial en GitHub.