Ich habe die Guava-API und die neuen Sammlungstypen, die sie bereitstellt ( Multimap
und die BiMap
beispielsweise nützlich erscheinen), schnell gescannt und denke darüber nach, die Bibliothek in die Projekte aufzunehmen, an denen ich arbeite.
Ich habe jedoch auch die Zurückhaltung, Bibliotheken wohl oder übel einzubeziehen, wenn sie keinen großen Nutzen haben und das Erlernen der Funktionen wertvolle Zeit verschwendet.
Haben Sie die Guava-Bibliothek in Ihr Projekt aufgenommen und hat sie sich auf unerwartete Weise als nützlich erwiesen? Würden Sie es in Zukunft immer verwenden? Was war der Hauptvorteil / die Zeitersparnis? Was sind seine versteckten Merkmale?
Antworten:
Im Ernst, alles in Guave ist nützlich. Ich benutze es schon eine ganze Weile und entdecke immer noch etwas Neues, das ich damit machen kann und das weniger Code benötigt als von Hand.
Einige Dinge haben andere nicht wirklich erwähnt, die ich liebe:
Multimap
s sind einfach toll. Wenn Sie so etwas wie verwendenMap<Foo, Collection<Bar>>
, verwenden Sie stattdessen eine Multimap und sparen Sie sich eine Menge mühsamer Überprüfungen einer vorhandenen Sammlung, die einem Schlüssel zugeordnet ist, und erstellen und fügen Sie sie hinzu, wenn sie nicht vorhanden ist.Ordering
ist ideal für GebäudeComparator
, die sich so verhalten, wie Sie es möchten.Maps.uniqueIndex
undMultimaps.index
: Diese Methoden nehmen einIterable
und einFunction
und erstellen einImmutableMap
oderImmutableListMultimap
, das die Werte in demIterable
durch das Ergebnis der Anwendung der Funktion auf jedes indiziert . Mit einer Funktion, die die ID eines Elements abruft, können Sie eine Liste von Elementen anhand ihrer ID in einer Zeile indizieren.filter
,transform
usw. Trotz der Ausführlichkeit der Verwendung von Klassen fürFunction
s undPredicate
s, habe ich das nützlich gefunden. Ich gebe ein Beispiel für eine Möglichkeit, dies hier gut lesen zu lassen .ComparisonChain
ist eine kleine, leicht zu übersehende Klasse, die nützlich ist, wenn Sie eine Vergleichsmethode schreiben möchten, die mehrere Werte nacheinander vergleicht und zurückgeben sollte, wenn der erste Unterschied gefunden wird. Es beseitigt die Langeweile und macht es nur zu ein paar Zeilen verketteter Methodenaufrufe.Objects.equal(Object,Object)
- null safe ist gleich.Objects.hashCode(Object...)
- Einfacher Weg, um einen Hash-Code zu erhalten, der auf mehreren Feldern Ihrer Klasse basiert.Objects.firstNonNull(Object,Object)
- reduziert den Code zum Abrufen eines Standardwerts, wenn der erste Wert null ist, insbesondere wenn der erste Wert das Ergebnis eines Methodenaufrufs ist (Sie müssten ihn einer Variablen zuweisen, bevor Sie dies auf normale Weise tun).CharMatcher
s wurden bereits erwähnt, aber sie sind sehr mächtig.Throwables
Throwables.propagate
Ermöglicht es Ihnen, einige nette Dinge mit Wurfgegenständen zu tun, z. B. welche einen Wurfgegenstand erneut werfen, wenn es einRuntimeException
oder ein ist,Error
und ihn in einen einwickelnRuntimeException
und das ansonsten werfen.Ich könnte sicherlich weitermachen, aber ich muss mich an die Arbeit machen. =) Obwohl ich einige Dinge aufgelistet habe, die mir hier gefallen, ist die Tatsache, dass alles in Guava in der einen oder anderen Situation nützlich ist. Vieles davon ist sehr oft nützlich. Wenn Sie es verwenden, werden Sie weitere Verwendungszwecke entdecken. Wenn Sie es nicht benutzen, fühlen Sie sich ein bisschen wie eine Hand hinter Ihrem Rücken gebunden.
quelle
ComparisionChain
.Ich benutze Guava seit ein paar Jahren effektiv in Google - und es ist wunderbar.
Die Teile, die ich besonders mag, sind:
Charsets.*
- so einfach, so nützlichSplitter
/.Joiner
Preconditions
quelle
Ich habe es ursprünglich für Sammlungskürzel verwendet. Zum Beispiel anstelle von:
du kannst das:
Es ist auch einfach, Karten zu füllen:
Jetzt habe ich einige andere nützliche Dienstprogramme entdeckt, die in Guava vorhanden sind. Mit der CharMatcher- Klasse können Sie beispielsweise Zeichenfolgen abgleichen . Du kannst tun:
oder
quelle
Die vorberechnete () Methode ( Quelle ) von CharMatcher ist eine nette "versteckte Funktion", auf die ich neulich gestoßen bin.
Es ist wirklich nur eine Optimierung, die eine Nachschlagetabelle (unter Verwendung eines Bit-Arrays) erstellt und dann einfach nach Zeichen sucht, um festzustellen, ob sie "übereinstimmen".
Es ist die Art von versteckter Optimierung, die Sie nutzen können, wenn Sie eine Bibliothek verwenden, an die Sie in Ihrem eigenen Code möglicherweise nicht gedacht haben.
Wenn Sie einen komplexen CharMatcher erstellen, den Sie häufig verwenden möchten, müssen Sie natürlich daran denken, die Methode precomputed () wie folgt aufzurufen:
quelle
Hier ist ein YouTube-Video von Google (Sprecher: Kevin Bourrillion, leitender Ingenieur für Googles Java-Kernbibliotheken), das die Schönheit von Google Collections zeigt. Eine Sache, die Google getan hat und die ich für brillant halte , ist die Gewährleistung der Unveränderlichkeit in Sammlungen.
quelle
Google Guava ist eine Utility-Bibliothek, daher bezweifle ich, dass sich darin eine Killer-Klasse befindet. Das Ganze am Dienstprogramm ist, dass Sie es fast in jedem Ihrer Projekte verwenden. Ich kann mich an kein Projekt erinnern, das keine Java-Sammlung verwendet. Und die Wahrheit ist, dass das Erfassungsprogramm von Google Guava wunderbar ist und im Java SDK selbst enthalten sein sollte.
Ich habe drei Artikel über Klassen in Google Guava geschrieben:
CheckedFuture
: http://blog.firdau.si/2010/07/07/guava-using-checkedfuture/ListenableFuture
: http://blog.firdau.si/2010/07/05/guava-using-listenablefuture/ComputingMap
in der Google-Sammlung (jetzt Guave) http://blog.firdau.si/2009/11/13/computing-map-on-google-collections/Und das ist noch nicht alles, es gibt viele andere Dinge, die Sie mit Guave tun können.
quelle
Absolut sehr super nützlich. Es ist fast immer die erste Bibliothek, die einem neuen Projekt hinzugefügt wurde.
Insgesamt ist die Bibliothek von sehr hoher Qualität. Die API ist gut durchdacht, die Implementierung solide. Sehr empfehlenswert.
quelle
MapMaker bietet jetzt begrenzte LRU-Caches an - das ist eine wesentliche Maschinerie, die sich hinter einer winzigen API verbirgt. Dies hat das Potenzial für einen enormen Nutzen, und ich bin immer noch im ganzen Code.
quelle