Ricettario delle collezioni Guava

1. Introduzione

Questo articolo del libro di cucina è organizzato in ricette piccole e mirate e frammenti di codice per l'utilizzo di raccolte in stile Guava.

Il formato è quello di un elenco crescente di esempi di codice senza ulteriori spiegazioni necessarie: ha lo scopo di mantenere gli usi comuni dell'API di facile accesso durante lo sviluppo.

2. Le Ricette

downcast di un elenco in un elenco

- nota : questa è una soluzione alternativa per le raccolte generate non covarianti in 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 più semplice senza Guava - coinvolgendo 2 operazioni di cast

List originalList = Lists.newArrayList(); List theList = (List) (List) originalList;

aggiunta di un iterabile a una raccolta

Iterable iter = Lists.newArrayList(); Collection collector = Lists.newArrayList(); Iterables.addAll(collector, iter);

controlla se la raccolta contiene elementi in base a una regola di corrispondenza personalizzata

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);

soluzione alternativa utilizzando la ricerca

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);

soluzione alternativa applicabile solo agli insiemi

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 su Iterables. Trova quando non viene trovato nulla

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);

- questo genererà l' eccezione 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)

- soluzione : esiste un metodo find sovraccarico che accetta il valore di ritorno predefinito come argomento e può essere chiamato con null per il comportamento desiderato:

String found = Iterables.find(theCollection, inputOfLengthOne, null);

rimuove tutti i valori null da una raccolta

List values = Lists.newArrayList("a", null, "b", "c"); Iterable withoutNulls = Iterables.filter(values, Predicates.notNull());

creare direttamente elenchi / gruppi / mappe immutabili

ImmutableList immutableList = ImmutableList.of("a", "b", "c"); ImmutableSet immutableSet = ImmutableSet.of("a", "b", "c"); ImmutableMap imuttableMap = ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3");

creare elenchi / gruppi / mappe immutabili da una raccolta standard

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);

soluzione alternativa utilizzando i builder

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. Altri libri di cucina Guava

Guava è una libreria completa e straordinariamente utile: ecco alcune altre API trattate in formato ricettario:

  • Guava Ordering Cookbook

  • Ricettario Funzionale Guava

Godere.

4. Andando avanti

Come ho accennato all'inizio, sto sperimentando questo formato diverso - il ricettario - per cercare di raccogliere semplici attività comuni sull'utilizzo delle collezioni Guava in un unico posto. L'obiettivo di questo formato è la semplicità e la velocità, quindi la maggior parte delle ricette non ha spiegazioni aggiuntive oltre all'esempio di codice stesso .

Infine - lo sto guardando come un documento vivente - continuerò ad aggiungere ricette ed esempi mentre li incontro. Sentiti libero di fornire di più nei commenti e cercherò di incorporarli nel libro di cucina.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata su GitHub : questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.