1. Introducción
Este artículo de libro de cocina está organizado en recetas y fragmentos de código pequeños y enfocados para usar colecciones de estilo Guava.
El formato es el de una lista cada vez mayor de ejemplos de código sin necesidad de explicación adicional; está destinado a mantener los usos comunes de la API de fácil acceso durante el desarrollo.
2. Las recetas
rebajar una lista a una lista
- nota : esta es una solución para las colecciones generadas no covariantes en Java
class CastFunction implements Function { @Override public final T apply(final F from) { return (T) from; } } List originalList = Lists.newArrayList(); List theList = Lists.transform(originalList, new CastFunction());
alternativa más simple sin guayaba - que involucra 2 operaciones de lanzamiento
List originalList = Lists.newArrayList(); List theList = (List) (List) originalList;
agregando un iterable a una colección
Iterable iter = Lists.newArrayList(); Collection collector = Lists.newArrayList(); Iterables.addAll(collector, iter);
comprobar si la colección contiene elementos de acuerdo con una regla de coincidencia personalizada
Iterable theCollection = Lists.newArrayList("a", "bc", "def"); boolean contains = Iterables.any(theCollection, new Predicate() { @Override public boolean apply(final String input) { return input.length() == 1; } }); assertTrue(contains);
solución alternativa mediante búsqueda
Iterable theCollection = Sets.newHashSet("a", "bc", "def"); boolean contains = Iterables.find(theCollection, new Predicate() { @Override public boolean apply(final String input) { return input.length() == 1; } }) != null; assertTrue(contains);
solución alternativa solo aplicable a Sets
Set theCollection = Sets.newHashSet("a", "bc", "def"); boolean contains = !Sets.filter(theCollection, new Predicate() { @Override public boolean apply(final String input) { return input.length() == 1; } }).isEmpty(); assertTrue(contains);
NoSuchElementException en Iterables.find cuando no se encuentra nada
Iterable theCollection = Sets.newHashSet("abcd", "efgh", "ijkl"); Predicate inputOfLengthOne = new Predicate() { @Override public boolean apply(final String input) { return input.length() == 1; } }; String found = Iterables.find(theCollection, inputOfLengthOne);
- esto lanzará la excepción NoSuchElementException :
java.util.NoSuchElementException at com.google.common.collect.AbstractIterator.next(AbstractIterator.java:154) at com.google.common.collect.Iterators.find(Iterators.java:712) at com.google.common.collect.Iterables.find(Iterables.java:643)
- solución : hay un método de búsqueda sobrecargado que toma el valor de retorno predeterminado como argumento y se puede llamar con nulo para el comportamiento deseado:
String found = Iterables.find(theCollection, inputOfLengthOne, null);
eliminar todos los valores nulos de una colección
List values = Lists.newArrayList("a", null, "b", "c"); Iterable withoutNulls = Iterables.filter(values, Predicates.notNull());
crear lista / conjunto / mapa inmutable directamente
ImmutableList immutableList = ImmutableList.of("a", "b", "c"); ImmutableSet immutableSet = ImmutableSet.of("a", "b", "c"); ImmutableMap imuttableMap = ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3");
crear una lista / conjunto / mapa inmutable a partir de una colección estándar
List muttableList = Lists.newArrayList(); ImmutableList immutableList = ImmutableList.copyOf(muttableList); Set muttableSet = Sets.newHashSet(); ImmutableSet immutableSet = ImmutableSet.copyOf(muttableSet); Map muttableMap = Maps.newHashMap(); ImmutableMap imuttableMap = ImmutableMap.copyOf(muttableMap);
solución alternativa utilizando constructores
List muttableList = Lists.newArrayList(); ImmutableList immutableList = ImmutableList. builder().addAll(muttableList).build(); Set muttableSet = Sets.newHashSet(); ImmutableSet immutableSet = ImmutableSet. builder().addAll(muttableSet).build(); Map muttableMap = Maps.newHashMap(); ImmutableMap imuttableMap = ImmutableMap. builder().putAll(muttableMap).build();
3. Más libros de cocina de guayaba
Guava es una biblioteca completa y fantásticamente útil; aquí hay algunas API más cubiertas en forma de libro de cocina:
Libro de cocina para pedidos de guayaba
Libro de cocina funcional de guayaba
Disfrutar.
4. Avanzando
Como mencioné al principio, estoy experimentando con este formato diferente, el libro de cocina , para tratar de reunir las tareas comunes simples de usar las colecciones de guayaba en un solo lugar. El enfoque de este formato es la simplicidad y la velocidad, por lo que la mayoría de las recetas no tienen una explicación adicional que no sea el ejemplo de código en sí .
Finalmente, lo veo como un documento dinámico, seguiré agregando recetas y ejemplos a medida que los encuentre. Siéntase libre de proporcionar más en los comentarios y buscaré incorporarlos en el libro de cocina.
La implementación de todos estos ejemplos y fragmentos de código se puede encontrar en GitHub : este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar como está.