La libreria Guava: quali sono le sue funzioni più utili e / o nascoste? [chiuso]


131

Ho avuto una rapida scansione dell'API di Guava e dei nuovi tipi di raccolta che fornisce ( Multimape BiMapad esempio sembrano utili) e sto pensando di includere la biblioteca nei progetti su cui lavoro.

Tuttavia, ho anche una certa reticenza di includere le biblioteche, volenti o nolenti, se non sono di grande beneficio e l'apprendimento delle funzionalità fa perdere tempo prezioso.

Hai incluso la libreria Guava nel tuo progetto e si è rivelata utile in qualche modo inaspettato? Lo useresti sempre in futuro? Qual è stato il suo principale vantaggio / risparmio di tempo? Quali sono le sue funzioni nascoste?


4
Il tuo titolo e la tua domanda non corrispondono davvero.
aioobe,

4
"i nuovi tipi di raccolta ... sembrano utili" e "Ho una certa reticenza nell'includere le biblioteche ... se non sono di grande beneficio" - allora quale è? o pensi che la biblioteca sia utile e abbia dei benefici o no
matt b

A partire dal 2017 (domanda ora chiusa), se si utilizza l'ultimo Gradle (4.4.1) guava 21.0 viene aggiunto a build.gradle per impostazione predefinita come dipendenza, con le parole "Questa dipendenza viene utilizzata internamente e non esposta ai consumatori sul proprio percorso di compilazione ", suggerendo che il team Gradle ha deciso che ci sono cose davvero preziose.
mike rodent,

Risposte:


158

Seriamente, tutto in Guava è utile. Lo sto usando da un po 'di tempo e sto ancora scoprendo qualcosa di nuovo che posso fare con esso che richiede meno codice rispetto a farlo a mano.

Alcune cose che altri non hanno veramente detto che adoro:

  • Multimapsono semplicemente fantastici. Ogni volta che utilizzi qualcosa del genere Map<Foo, Collection<Bar>>, usa invece una multimappa e risparmia un sacco di noiosi controlli per una raccolta esistente mappata su una chiave e la creazione e l'aggiunta se non è presente.
  • Ordering è ottimo per la costruzione Comparator s che si comportino proprio come vuoi tu.
  • Maps.uniqueIndexe Multimaps.index: questi metodi prendono an Iterablee a Functione costruiscono un ImmutableMapo ImmutableListMultimapche indicizza i valori inIterable tramite il risultato dell'applicazione della funzione a ciascuno. Pertanto, con una funzione che recupera l'ID di un elemento, è possibile indicizzare un elenco di elementi in base al loro ID in una riga.
  • Le cose funzionali che fornisce ... filter, transformecc. Nonostante la verbosità di usare le classi per Functions e Predicates, l'ho trovato utile. Faccio un esempio di un modo per farlo leggere bene qui .
  • ComparisonChainè una classe piccola, facilmente trascurabile, utile quando si desidera scrivere un metodo di confronto che confronta più valori in successione e dovrebbe restituire quando viene rilevata la prima differenza. Rimuove tutto il tedio di quello, rendendolo solo poche righe di chiamate di metodo concatenate.
  • Objects.equal(Object,Object) - null sicuro è uguale.
  • Objects.hashCode(Object...) - Un modo semplice per ottenere un codice hash basato su più campi della tua classe.
  • Objects.firstNonNull(Object,Object) - riduce il codice per ottenere un valore predefinito se il primo valore è nullo, soprattutto se il primo valore è il risultato di una chiamata del metodo (dovresti assegnarlo a una variabile prima di farlo normalmente).
  • CharMatchersono già stati menzionati, ma sono molto potenti.
  • Throwablesti permette di fare delle cose carine con i lanciatori, come ad esempio quello Throwables.propagateche ricomincia a lanciare se è a RuntimeExceptiono an Errore lo avvolge in a RuntimeExceptione lo lancia altrimenti.

Potrei certamente andare avanti, ma devo andare al lavoro. =) Comunque, nonostante abbia elencato alcune cose che mi piacciono qui, il fatto è che tutto in Guava è utile in una situazione o in un'altra. Molto è utile molto spesso. Mentre lo usi, scoprirai più usi. Non usarlo sembrerà un po 'come avere una mano legata dietro la schiena.


2
Totalmente d'accordo ComparisionChain.
whiskeysierra,

44

Uso effettivamente Guava da un paio d'anni, all'interno di Google - ed è meraviglioso.

Le parti a cui sono particolarmente affezionato sono:

  • Charsets.* - così semplice, così utile
  • collezioni
  • Gestione IO (leggi una risorsa completamente in una sola riga, ecc.)
  • Splitter/Joiner
  • Preconditions

6
Si noti che ora abbiamo StandardCharset in Java 7+. Mi chiedo quante altre funzionalità di Guava siano state introdotte in Java.
DavidS,

1
Ho trovato questo plug-in Maven di Modernizer che rileva l'utilizzo di API legacy, incluse librerie di terze parti come Guava. Il file di configurazione sembra contenere 67 deprecazioni di Guava, inclusi StandardCharsets.
David

28

Inizialmente l'ho usato per le raccolte brevi. Ad esempio, anziché:

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();

Puoi farlo:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();

È anche facile popolare le mappe:

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");

Ora, ho scoperto alcune altre utili utilità presenti in Guava. Ad esempio, la classe CharMatcher consente di abbinare sequenze di caratteri. Tu puoi fare:

CharMatcher.inRange('a','z').or(inRange('A','Z'));

o

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");

21

Il metodo precompilato () di CharMatcher ( fonte ) è una bella "caratteristica nascosta" che mi sono imbattuto l'altro giorno.

È davvero solo un'ottimizzazione, che crea una tabella di ricerca (usando un array di bit), e quindi cerca semplicemente i caratteri per vedere se "corrispondono".

È il tipo di ottimizzazione nascosta che puoi sfruttare quando usi una libreria, che potresti non aver pensato a te stesso nel tuo codice.

Naturalmente, se crei un CharMatcher complesso, che prevedi di utilizzare più volte, devi ricordare di chiamare il metodo precompilato (), come:

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();

Ho anche domande sulla guava ListenableFuture . Se possibile, puoi rivedere il mio progetto e aiutarmi a chiarire alcuni dei miei dubbi e come dovrei affrontarli? Di recente ho iniziato a lavorare con Guava ListenableFuture e mi piace molto, ma ho un po 'di confusione su come usarli in modo efficiente.
Giovanni

16

Ecco un video di YouTube di Google (relatore: Kevin Bourrillion, ingegnere capo delle principali librerie Java di Google) che mostra la bellezza di Google Collections. Una cosa che Google ha fatto, che credo sia geniale, è garantire l' immutabilità nelle collezioni.


12

Google Guava è una libreria di utilità, quindi dubito che al suo interno vi sia una classe killer. L'intero aspetto dell'utilità è che lo usi quasi in tutti i progetti che hai. Non ricordo nessun progetto che ho fatto che non usi la raccolta Java. E la verità è che l'utilità di raccolta di Google Guava è meravigliosa e dovrebbe trovarsi nello stesso SDK Java.

Ho scritto tre articoli sui corsi su Google Guava:

E questo non è tutto, ci sono molte altre cose che puoi fare con Guava.


8

Assolutamente molto utile. È quasi invariabilmente la prima biblioteca aggiunta a un nuovo progetto.

  1. Siamo molto affezionati a Iteratori / Iterabili e all'interfaccia Funzione.
  2. La famiglia di interfacce Service è una grande astrazione
  3. Siamo così impegnati che abbiamo iniziato a utilizzare le classi ImmutableXXX dei nostri tipi di API per comunicare che non può essere modificato.
  4. Le mappe informatiche (di MapMaker) sono meravigliose in determinate situazioni.

Nel complesso, la biblioteca è di altissima qualità. L'API è ben pensata, l'implementazione solida. Altamente raccomandato.


7

MapMaker ora offre cache LRU limitate: si tratta di alcune macchine sostanziali nascoste dietro una piccola API. Questo ha il potenziale per un'enorme utilità e sono ancora in tutto il codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.