web-dev-qa-db-fra.com

La bibliothèque Guava: quelles sont ses fonctionnalités les plus utiles et / ou cachées?

J'ai analysé rapidement Guava API et les nouveaux types de collections qu'il fournit (Multimap et BiMap par exemple, semblent utiles) et je songe à inclure le bibliothèque du ou des projets sur lesquels je travaille.

Cependant, j'ai également une réticence à inclure les bibliothèques au gré de leurs envies si elles ne sont pas très utiles et l'apprentissage des fonctionnalités fait perdre un temps précieux.

Avez-vous inclus la bibliothèque Guava dans votre projet et s'est-elle révélée utile de manière inattendue? Souhaitez-vous toujours l'utiliser à l'avenir? Quel a été son principal avantage/gain de temps? Quelles sont ses fonctionnalités cachées?

130
NimChimpsky

Sérieusement, tout à Guava est utile. Je l'utilise depuis un bon moment et je découvre toujours quelque chose de nouveau que je peux faire avec moins de code que de le faire à la main.

Certaines choses que d'autres n'ont pas vraiment mentionnées que j'aime:

  • Multimaps sont tout simplement géniaux. Chaque fois que vous utilisez quelque chose comme Map<Foo, Collection<Bar>>, Utilisez plutôt une carte multiple et économisez une tonne de vérification fastidieuse pour une collection existante mappée sur une clé et créez et ajoutez-la si elle n'est pas là.
  • Ordering est idéal pour créer des Comparators qui se comportent exactement comme vous le souhaitez.
  • Maps.uniqueIndex Et Multimaps.index: Ces méthodes prennent un Iterable et un Function et construisent un ImmutableMap ou ImmutableListMultimap qui indexe les valeurs dans Iterable par le résultat de l'application de la fonction à chacune. Ainsi, avec une fonction qui récupère l'ID d'un élément, vous pouvez indexer une liste d'éléments par leur ID sur une seule ligne.
  • Les éléments fonctionnels qu'il fournit ... filter, transform, etc. Malgré la verbosité de l'utilisation des classes pour Functions et Predicates, j'ai trouvé ceci utile. Je donne un exemple d'une façon de bien lire ceci ici .
  • ComparisonChain est une petite classe facilement ignorée qui est utile lorsque vous voulez écrire une méthode de comparaison qui compare plusieurs valeurs successivement et devrait revenir lorsque la première différence est trouvée. Il supprime tout l'ennui de cela, ce qui en fait seulement quelques lignes d'appels de méthode en chaîne.
  • Objects.equal(Object,Object) - nul sûr égal.
  • Objects.hashCode(Object...) - moyen facile d'obtenir un code de hachage basé sur plusieurs champs de votre classe.
  • Objects.firstNonNull(Object,Object) - réduit le code pour obtenir une valeur par défaut si la première valeur est nulle, en particulier si la première valeur est le résultat d'un appel de méthode (vous devez l'affecter à une variable avant de le faire, le manière normale).
  • CharMatchers ont déjà été mentionnés, mais ils sont très puissants.
  • Throwables vous permet de faire de belles choses avec des objets jetables, comme Throwables.propagate qui rejette un objet jetable s'il s'agit d'un RuntimeException ou d'un Error et l'enveloppe dans un RuntimeException et jette cela autrement.

Je pourrais certainement continuer, mais je dois me mettre au travail. =) Quoi qu'il en soit, bien que j'aie énuméré certaines choses que j'aime ici, le fait est que tout à Guava est utile dans une situation ou une autre. Une grande partie est très souvent utile. En l'utilisant, vous découvrirez plus d'utilisations. Si vous ne l'utilisez pas, vous aurez l'impression d'avoir une main attachée derrière le dos.

158
ColinD

J'utilise efficacement Guava depuis quelques années, au sein de Google - et c'est merveilleux.

Les parties que j'aime en particulier sont:

  • Charsets.* - si simple, si utile
  • Les collections
  • Gestion des E/S (lire une ressource complètement sur une seule ligne, etc.)
  • Splitter/Joiner
  • Preconditions
43
Jon Skeet

Je l'ai d'abord utilisé pour les raccourcis de collections. Par exemple, au lieu de:

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

tu peux le faire:

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

Il est également facile de remplir des cartes:

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

Maintenant, j'ai découvert quelques autres utilitaires utiles présents dans Guava. Par exemple, la classe CharMatcher vous permet de faire correspondre des séquences de caractères. Tu peux faire:

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

ou

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

La méthode precomputed () de CharMatcher ( source ) est une belle "fonctionnalité cachée" que je suis tombée sur l'autre jour.

C'est vraiment juste une optimisation, qui crée une table de recherche (à l'aide d'un tableau de bits), puis recherche simplement les caractères pour voir s'ils "correspondent".

C'est le type d'optimisation cachée que vous pouvez exploiter lorsque vous utilisez une bibliothèque, que vous n'avez peut-être pas pensé à vous-même dans votre propre code.

Bien sûr, si vous créez un CharMatcher complexe, que vous prévoyez d'utiliser plusieurs fois, vous devez vous rappeler d'appeler la méthode precomputed (), comme:

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

Voici une vidéo YouTube de Google (conférencier: Kevin Bourrillion, ingénieur principal pour le noyau de Google Java bibliothèques) qui montre la beauté des collections Google. Une chose que Google a fait, qui Je crois que c'est génial, c'est garantie Immuabilité dans les collections.

16
Buhake Sindi

Google Guava est une bibliothèque d'utilitaires, donc je doute qu'il y ait une classe de tueur à l'intérieur. Tout ce qui concerne l'utilité est que vous l'utilisez presque dans tous les projets que vous avez. Je ne me souviens d'aucun projet que j'ai fait qui n'utilise pas Java collection. Et la vérité est, l'utilitaire de collecte de Google Guava est merveilleux et devrait être dans le Java SDK lui-même.

J'ai écrit trois articles sur les cours sur Google Guava:

Et ce n'est pas tout, il y a beaucoup d'autres choses que vous pouvez faire avec la goyave.

12
nanda

Absolument très super utile. C'est presque toujours la première bibliothèque ajoutée à un nouveau projet.

  1. Nous aimons beaucoup les Itérateurs/Iterables et l'interface Function.
  2. La famille d'interfaces Service est une excellente abstraction
  3. Nous sommes tellement déterminés que nous avons commencé à utiliser les classes ImmutableXXX nos types d'API pour communiquer qu'il ne peut pas être modifié.
  4. Les cartes informatiques (de MapMaker) sont merveilleuses dans certaines situations.

Dans l'ensemble, la bibliothèque est de très haute qualité. L'API est bien pensée, l'implémentation solide. Hautement recommandé.

8
Darren Gilroy

MapMaker propose désormais des caches LRU bornés - c'est-à-dire des machines importantes cachées derrière une minuscule API. Cela a un potentiel énorme, et je suis toujours dans le code.

7
Dimitris Andreou