El concepto de Java Tuple , es un concepto un poco peculiar . Otros lenguajes como C# o TypeScript lo incorporan de forma natural pero en Java es necesario usar una librería adicional Java Tuples . Esta librería nos la podemos importar con maven ya que se trata de un añadido muy sencillo al lenguaje Java.
<!-- https://mvnrepository.com/artifact/org.javatuples/javatuples --> <dependency> <groupId>org.javatuples</groupId> <artifactId>javatuples</artifactId> <version>1.2</version> </dependency>
¿Para que sirve un Java Tuple comparado con un concepto más clásico de diccionario o HashMap. Vamos a ver un ejemplo usando un diccionario :
package com.arquitecturajava; import java.util.HashMap; import java.util.Map; public class Principal { public static void main(String[] args) { Map<String,String> mapa= new HashMap<>(); mapa.put("nombre","cecilio"); mapa.put("apellidos","alvarez"); System.out.println(mapa.get("nombre")); System.out.println(mapa.get("apellidos")); } }
En este caso hemos construido un diccionario de cadenas . El diccionario tiene dos items uno que define el nombre y su valor , en este caso nombre=”cecilio” y el otro el que define el apellido apellidos=”alvarez” . Por lo tanto estamos ante una estructura de clave/valor. Estas estructuras son muy útiles y en el mundo Java las necesitamos siempre.
Sin embargo hay situaciones que necesitamos otro tipo de estructura. Cuando uno maneja un diccionario siempre esta obligado a saber las claves para poder obtener los valores. Existen situaciones en las que no necesitamos las capacidades de un diccionario ya que por ejemplo sabemos el orden de los valores que vamos a recibir. Esto puede sonar un poco extraño pero vamos a ver un ejemplo que ayude a clarificar. Imaginemonos que necesitamos realizar una consulta contra la base de datos en esa consulta podemos elegir la columna que queremos y pasarle un valor . La base de datos nos devolverá el resultado cuando generemos correctamente la consulta. Una opción parar realizar esto es usar un diccionario.
package com.arquitecturajava; import java.util.HashMap; import java.util.Map; public class Principal3 { public static void main(String[] args) { Map<String,String> mapa= new HashMap<>(); mapa.put("columna","titulo"); mapa.put("valor","java"); String consulta= "select "+mapa.get("columna")+ " from libros where " + mapa.get("columna") +"='"+ mapa.get("valor")+"'"; System.out.println(consulta); } }
Si ejecutamos este código nos podremos dar cuenta que se imprime la consulta por la consola:
¿Es esto totalmente correcto? En principio lo parece , pero claro mucha gente nos dirá . Uff usar un diccionario para simplemente acceder a un conjunto de valores … que no necesitan de ningún tipo de filtrado , quizás podamos hacer algo más directo. Para esto existe el concepto de tupla .
Una tupla no almacena clave y valores almacena solo valores.
package com.arquitecturajava; import org.javatuples.Pair; public class Principal2 { public static void main(String[] args) { Pair<String, String> tupla = new Pair<String, String>("titulo", "java"); String consulta = "select " + tupla.getValue0() + " from libros where " + tupla.getValue1() + "='"+ tupla.getValue1() + "'"; System.out.println(consulta); } }
En este caso hemos usado una java tuple en formato de pareja ya que es la más habitual pero se puede ver cómo el código se simplifica claramente . Las tuplas pueden tener hasta 10 elementos como valores por lo tanto aportan bastante flexibilidad al código.
Otros artículos relacionados
No soy el experto en programación, pero el hecho de conocer las diferentes opciones que podríamos aplicar a un determinado problema sería ideal y objetivo, aveces descartamos posibilidades sólo por el hecho que ya están anticuadas. Y en su momento como comenta Cecilio nos pueden sacar de problemas de forma eficiente.
Creería que las tuplas tienen su valor dependiendo del programador que les vea su aplicabilidad y potencial.
gracias 🙂
Aunque el uso de Tuplas puede ser muy cómodo, desde mi punto de vista es claramente un smell code. muestra la falta de abstracción del negocio y la carencia de un buen diseño. En cualquier caso que se utilice es una Tupla es mejor crear una clase que represente los datos; ya que getValue0() y getValue1() no representa nada. por ejemplo una clase con campos getSelectFields() y getWhereFields() da una mejor idea de la utilidad de cada atributo. Adicionalmente hay que tener cuidado con esos casos donde necesitamos una tapla ya que los datos que vamos a poner no tienen… Read more »
Tienes una parte de razón pero , date cuenta que a veces pueden ser necesarias . Por ejemplo TypeScript y C# que son lenguajes modernos las soportan de forma nativa. Hay en situaciones que las propiedades pueden ser muy dinámicas y la tupla aporta valor.
Hola Javier,
No entiendo muy bien la diferencia de usar una tupla y usar un array. Puedes explicar qué mejora la tupla?
Gracias
En un array el tamaño no esta nunca claro salvo en la inicialización , en una tupla los elementos estan delimitados siempre 🙂