Font Size

SCREEN

Profile

Layout

Direction

Menu Style

Cpanel

Aninki Code

Guava


El proyecto de guava contiene varias librerias para distintas utilidades : colecciones, caché,  primitivos,  concurrencia, las anotaciones comunes, procesamiento de cadenas, I / O, y así sucesivamente.

+ INFO

GUAVA - Indice contenidos

 Esta no pretende ser una lista exhaustiva de la funcionalidades en guava, sino sólo de las que he encontrado más utiiles.

 

GUAVA -Tratando null

Uno de los mayores problemas de java es como tratar los null, sobre todo en las colecciones. Guava nos da un soporte con el objeto Optinal. En este obejeto nos da una ayuda para los nulos, ya que en caso de no exitir un valor en un mapa, por ejemplo, nos devuelve un objeto del tipo Optional.absent()

		Map mapa =new HashMap();
		mapa.put("uno", 1);
		mapa.put("dos", 2);
		Optional<Map> possible = Optional.of(mapa);
		possible.isPresent(); // devuelve true true		
		possible.get(); // devuelve {uno=1, dos=2}
		Optional.fromNullable((mapa).get("uno"));//devuelve Optional.of(1)
		Optional.fromNullable((mapa).get("cien"));// devuelve Optional.absent(), no null.

 

GUAVA - Comparator

Guava nos da cierta facilidad a la hora de realizar ordenaciones, ahorrandonos el uso de comparators, que siempre son un poco jaleosos.

		  Ordering byLengthOrdering = new Ordering() {
		  public int compare(String left, String right) {
		       return Ints.compare(left.length(), right.length());
		     }
		   };
		 List intList = Lists.newArrayList(5, 7, 6, 1, 2, 9, 8, 4, 3,null);
	
 
		  List sortedCopy = Ordering.natural().nullsFirst().reverse().sortedCopy(intList);
		  //devuelve[9, 8, 7, 6, 5, 4, 3, 2, 1, null]

En este ejemplo hemos usado los parametros reverse(), para que nos devuelva los valores en orden inverso, así como el método nullsFirst() para que nos ponga los null al principio. 

Fuente : http://bethecoder.com/applications/tutorials/tools-and-libs/google-guava/collections/reverse-ordering.html

GUAVA - Cache

Guava nos da cierta facilidad a la hora de gestionar la cache. Nos permite acceder dicha cache, pudiendo dar además un tiempo de expiración, capacidad máxima, etc.

También podemos definir un listener para cuando se produce un borrado( removalListener(removalListener) ), una capacidad máxima ( maximumSize(10) ) ó un tiempo de duración en la cache ( expireAfterWrite(10.TimeUnit.MINUTES) )

	

		  RemovalListener removalListener = new RemovalListener() {
		  
		 public void onRemoval(RemovalNotification removal) {
		  System.out.println("On removal");
		  }
		};	
...
		LoadingCache mycache = CacheBuilder.newBuilder()
		   .maximumSize(10).expireAfterWrite(10, 
		   TimeUnit.MINUTES).
		   removalListener(removalListener)		  
		   .build(
		       new CacheLoader() {
		    	   @Override
		    	   public String load(String key) throws Exception {
		           		
		           		return "texto de la key :"+key;
		           			
		         }
		       });
...
		mycache.get("aa")

 

GUAVA - Collections

Indudablemente el punto fuerte de Guava son los diferentes tipos  collections que contiene, las cuales nos hacen la vida bastante más sencilla.

Multiset

Básicamente, es un Set que puede tener varias instancias de la misma clase, pero no es una lista ya que la lista está ordenada. Multiset se encuentra en un puto medio entre Listas y Sets.

Dispone,además, de varias  utilidades como contar un elemento en concreto,obtener los eleemntos únicos,etc.

	

		Multiset wordsMultiset = HashMultiset.create();
		wordsMultiset.add("A");
		wordsMultiset.add("A");
		wordsMultiset.add("A");
		wordsMultiset.add("B");
		wordsMultiset.add("C");
		//no dice el numero de repeticiones en el set
		System.out.println("Multiset "+wordsMultiset.count("A"));
		//elementos diferentes
		System.out.println("Multiset "+wordsMultiset.elementSet());
		System.out.println("Multiset "+wordsMultiset.size());

BiMap

BiMap son operaciones especificas sobre mapas. Es, básicamente, un mapa bidireccional, en el que facilmente podemos cambiar entre clave y valor.

	

		BiMap biMap = HashBiMap.create();
		biMap.put(1, "a");
		biMap.put(2, "b");
		biMap.put(3, "c");
		 
		BiMap invertedMap = biMap.inverse();
		System.out.println("invertedMap"+invertedMap);

BiMap no permite incluir dos veces la misma clave ó valor (como es dicho, es un mapa bidireccional), a menos que lo solicitemos explicitamente con forcePut(), el cual sobreescribe el valor correspondiente en el mapa

 
		try{
			biMap.put(4,"a");
		}catch (IllegalArgumentException e){
			
		}	
		//permite dobles
		biMap.forcePut(4,"a");

fuente: http://blog.solidcraft.eu/2010/10/googole-guava-v07-examples.html

Table

Tables son utiles para los mapas que son (clave, mapa).

	

		Table table = HashBasedTable.create();
		table.put(1, "fila1", "1a");
		table.put(1, "fila2", "1b");
		table.put(2, "fila3", "2a");
		table.put(2, "fila4", "2b");		 
		
		System.out.println("table "+table);
		System.out.println("table "+table.row(1));//devuelve la clave 1
		System.out.println("table "+table.rowMap());//devuelve la clave y los hasMap asociados
		System.out.println("table "+table.rowKeySet());//listado de las keys

Listas

Para saber si todos los elementos cumplen una condición. Esto se hace mediante el uso de predicados

	
	//definiendo una lista
        List lista= Lists.newArrayList("A", "B","Z");
	// Uso de predicados
	static final Predicate isA = new Predicate() {
	    @Override
	    public boolean apply(final String stringValue) {
	        return stringValue.equalsIgnoreCase("A");
	    }
	  
	};
	...
	Iterables.all(lista, isA)

GUAVA - Rangos

Otra funcionalidad muy util es el soporte a rangos que nos proporciona la libreria. Nos permite definir rangos en concreto (abiertos,cerrados, etc), así como definir intersecciones entre diferentes rangos.

	

		Range validGrades0 = Ranges.open(1, 12);
		Range validGrades1 = Ranges.closed(1, 12);
		Range validGrades2 = Ranges.closedOpen(1, 12);
		Range validGrades3 = Ranges.openClosed(1, 12);
		Range validGrades4 = Ranges.greaterThan(1);
		Range validGrades5 = Ranges.atLeast(1);
		Range validGrades6 = Ranges.lessThan(1);
		Range validGrades7 = Ranges.atMost(1);
		//la principal operaicon
		validGrades0.contains(1);
		//comprueba si dos rangos se solapan
		validGrades0.isConnected(validGrades6);