Guava es la librería de Google para Java 1.5+ que fue lanzada al público durante el año 2009, luego de ser usada durante años en los proyectos internos de Google. La idea de Guava es proveer bloques constructivos basados en buenas prácticas que aumenten la productividad de los desarrolladores. Guava integra también lo que anteriormente era Google Collections, unificando las utilidades de entrada/salida, primitivas, concurrencia y colecciones en una única librería.
Muchos se preguntarán por qué razón Google decidió hacer su propia librería para trabajar con collections en lugar de utilizar la provista por el proyecto Apache Commons. Las principales causas que motivaron el nuevo desarrollo fueron que la librería de Apache no utiliza Generics y que algunas clases violan la especificación del Java Collections Framework.
Google Collections logra que escribamos mucho menos código para lograr lo mismo, ganando en expresividad y disminuyendo la probabilidad de introducir errores. Por ejemplo, no resulta extraño escribir código similar al siguiente para crear una lista inmutable en nuestros tests:
List<String> list = new ArrayList<String>();
list.add("a1");
list.add("b2");
list.add("c3");
list.add("d4");
Con Guava podemos realizar lo mismo en una sola línea de código:
ImmutableList<String> lista = ImmutableList.of("a1", "b2", "c3", "d4");
Guava contiene además una clase Splitter que intenta corregir las deficiencias de los métodos de splitting presentes en String, brindando más flexibilidad, así como también un Joiner que lo complementa.
String test = "uno,dos ,,tres,cuatro";
Iterable words = Splitter.on(',').split(test);
De acuerdo a lo que uno espera, words va a tener un elemento vacío producto de las dos comas seguidas en test, así como también un elemento que contiene espacios en blanco luego de “dos”. También se podría haber hecho lo mismo con String.split(). Sin embargo, el Splitter de Guava permite eliminar los espacios en blanco y los elementos vacíos de una forma muy sencilla:
Iterable<String> words = Splitter.on(',').trimResults().omitEmptyStrings().split(test);
Otro aspecto muy interesante es la posibilidad de realizar operaciones sobre conjuntos, tales como intersección, unión o diferencia. Realizar imports estáticos nos ayuda también a escribir menos código, teniendo como resultado algo más legible. En este caso en particular se realizan imports estáticos para aprovechar los métodos de creación de colecciones.
Algo que también está presente en Apache Commons y fue rediseñado en Guava es la posibilidad de validar precondiciones dentro de un método. Por ejemplo: Se convierte utilizando Guava en: También puede validarse que los argumentos no sean null, realizando las asignaciones correspondientes en caso de que no lo sean y lanzando una NullPointerException en otro caso. Se obtiene un código mucho más claro y conciso que si se realizaran los chequeos condicionales a mano. Google Guava contiene muchísimas otras features aparte de las presentadas en este post, desde herramientas funcionales como map y filter hasta una vasta cantidad de clases interesantes dentro del marco de collections, tales como MultiMap y MapMaker. En posteriores artículos se revisitarán partes específicas de esta librería para ver en mayor detalle todas las utilidades que nos provee (¡que son muchas!).
HashSet setUno = newHashSet(1, 2, 3, 4);
HashSet setDos = newHashSet(3, 4, 5, 6);
SetView union = Sets.union(setUno, setDos);
SetView difference = Sets.difference(setUno, setDos);
SetView intersection = Sets.intersection(setUno, setDos);
if (quantity < 0) {
throw new IllegalArgumentException("La cantidad debe ser positiva o cero: " + quantity);
}
checkArgument(quantity >= 0, "La cantidad debe ser positiva o cero: %s", quantity);
public NullCheckExample(final String album, final Date date) {
this.album = checkNotNull(album);
this.date = checkNotNull(date);
}
Algunos links interesantes
Groso!
Copado aunque estaría bueno ver alguna comparación entre las bibliotecas en código.
Igualmente muy buen post!