Die Guavenbibliothek: Was sind ihre nützlichsten und / oder verborgensten Funktionen? [geschlossen]


131

Ich habe die Guava-API und die neuen Sammlungstypen, die sie bereitstellt ( Multimapund die BiMapbeispielsweise 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?


4
Ihr Titel und Ihre Frage stimmen nicht wirklich überein.
Aioobe

4
"Die neuen Sammlungstypen ... scheinen nützlich zu sein" und "Ich habe die Zurückhaltung, Bibliotheken einzuschließen ... wenn sie keinen großen Nutzen haben" - nun, welche ist es dann? Sie denken entweder, dass die Bibliothek nützlich ist und Vorteile hat, oder Sie tun es nicht
matt b

Ab 2017 (Frage jetzt geschlossen) wird, wenn Sie die neueste Gradle (4.4.1) Guave 21.0 verwenden, standardmäßig als Abhängigkeit zu build.gradle hinzugefügt, mit den Worten "Diese Abhängigkeit wird intern verwendet und ist nicht für Verbraucher verfügbar." auf ihrem eigenen Kompilierungsklassenpfad ", was darauf hindeutet, dass das Gradle-Team entschieden hat, dass es einige wirklich wertvolle Dinge gibt.
Mike Nagetier

Antworten:


158

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:

  • Multimaps sind einfach toll. Wenn Sie so etwas wie verwenden Map<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.
  • Orderingist ideal für Gebäude Comparator, die sich so verhalten, wie Sie es möchten.
  • Maps.uniqueIndexund Multimaps.index: Diese Methoden nehmen ein Iterableund ein Functionund erstellen ein ImmutableMapoder ImmutableListMultimap, das die Werte in dem Iterabledurch 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.
  • Das funktionelle Material bietet es ... filter, transformusw. Trotz der Ausführlichkeit der Verwendung von Klassen für Functions und Predicates, habe ich das nützlich gefunden. Ich gebe ein Beispiel für eine Möglichkeit, dies hier gut lesen zu lassen .
  • ComparisonChainist 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).
  • CharMatchers wurden bereits erwähnt, aber sie sind sehr mächtig.
  • ThrowablesThrowables.propagateErmöglicht es Ihnen, einige nette Dinge mit Wurfgegenständen zu tun, z. B. welche einen Wurfgegenstand erneut werfen, wenn es ein RuntimeExceptionoder ein ist, Errorund ihn in einen einwickeln RuntimeExceptionund 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.


2
Stimme voll und ganz zu ComparisionChain.
Whiskysierra

44

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ützlich
  • Sammlungen
  • E / A-Behandlung (Lesen Sie eine Ressource vollständig in einer einzelnen Zeile usw.)
  • Splitter/.Joiner
  • Preconditions

6
Beachten Sie, dass wir jetzt StandardCharsets in Java 7+ haben. Ich frage mich, wie viele andere Funktionen von Guava ihren Weg in Java gefunden haben.
DavidS

1
Ich habe dieses Modernizer Maven Plugin gefunden, das die Verwendung älterer APIs erkennt, einschließlich Bibliotheken von Drittanbietern wie Guava. Die Konfigurationsdatei scheint 67 Guava-Verwerfungen zu enthalten, einschließlich StandardCharsets.
DavidS

28

Ich habe es ursprünglich für Sammlungskürzel verwendet. Zum Beispiel anstelle von:

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

du kannst das:

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

Es ist auch einfach, Karten zu füllen:

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

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:

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

oder

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

21

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:

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

Ich habe auch Fragen zu Guave ListenableFuture . Wenn möglich, können Sie mein Design überprüfen und mir helfen, einige meiner Zweifel zu klären und wie ich damit umgehen soll? Ich habe vor kurzem angefangen, mit Guava ListenableFuture zu arbeiten, und ich mag es sehr, habe aber einige Verwirrung darüber, wie ich sie effizient nutzen kann.
John

16

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.


12

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:

Und das ist noch nicht alles, es gibt viele andere Dinge, die Sie mit Guave tun können.


8

Absolut sehr super nützlich. Es ist fast immer die erste Bibliothek, die einem neuen Projekt hinzugefügt wurde.

  1. Wir lieben Iteratoren / Iterables und die Funktionsschnittstelle sehr.
  2. Die Service-Schnittstellenfamilie ist eine großartige Abstraktion
  3. Wir sind so engagiert, dass wir damit begonnen haben, die ImmutableXXX-Klassen unserer API-Typen zu verwenden, um zu kommunizieren, dass sie nicht geändert werden können.
  4. Das Berechnen von Karten (von MapMaker) ist in bestimmten Situationen wunderbar.

Insgesamt ist die Bibliothek von sehr hoher Qualität. Die API ist gut durchdacht, die Implementierung solide. Sehr empfehlenswert.


7

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.