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

131

J'ai eu une analyse rapide de l' API Guava et des nouveaux types de collections qu'elle fournit ( Multimapet BiMappar exemple semblent utiles) et je pense inclure la bibliothèque dans le ou les projets sur lesquels je travaille.

Cependant, j'ai aussi une réticence à inclure des bibliothèques bon gré mal gré si elles ne sont pas d'une grande utilité 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 avérée utile d'une manière inattendue? L'utiliseriez-vous toujours à l'avenir? Quel a été son principal avantage / gain de temps? Quelles sont ses caractéristiques cachées?

NimChimpsky
la source
4
Votre titre et votre question ne correspondent pas vraiment.
aioobe
4
"les nouveaux types de collections ... me semblent utiles" et "j'ai une réticence à inclure des bibliothèques ... si elles ne sont d'aucune utilité importante" - enfin, quel est-il alors? soit vous pensez que la bibliothèque est utile et a des avantages, soit vous ne le faites pas
matt b
1
À partir de 2017 (question maintenant fermée), si vous utilisez la dernière version de Gradle (4.4.1), la goyave 21.0 est ajoutée par défaut à build.gradle en tant que dépendance, avec les mots "Cette dépendance est utilisée en interne et non exposée aux consommateurs sur leur propre chemin de classe de compilation », suggérant que l'équipe Gradle a décidé qu'il y avait des choses vraiment précieuses là-dedans.
mike rodent

Réponses:

158

Sérieusement, tout dans Guava est utile. Je l'utilise depuis un bon moment et je découvre toujours quelque chose de nouveau que je peux faire avec qui prend 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 utiliseriez quelque chose comme Map<Foo, Collection<Bar>>, utilisez plutôt une multi-carte et évitez une tonne de vérification fastidieuse d'une collection existante mappée sur une clé et de la créer et de l'ajouter si elle n'est pas là.
  • Orderingest idéal pour les constructions Comparatorqui se comportent exactement comme vous le souhaitez.
  • Maps.uniqueIndexet Multimaps.index: ces méthodes prennent un Iterableet un Functionet construisent un ImmutableMapou ImmutableListMultimapqui indexe les valeurs dans Iterablele résultat de l'application de la fonction à chacun. 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 ligne.
  • L'étoffe fonctionnelle fournit ... filter, transformetc. Malgré la verbosité d'utiliser des classes pour Functions et Predicates, j'ai trouvé cela utile. Je donne un exemple d'une façon de rendre cela bien lu ici .
  • ComparisonChainest une petite classe facilement négligée qui est utile lorsque vous souhaitez écrire une méthode de comparaison qui compare plusieurs valeurs successivement et qui doit revenir lorsque la première différence est trouvée. Cela supprime tout l'ennui de cela, ce qui en fait juste quelques lignes d'appels de méthode chaînés.
  • Objects.equal(Object,Object) - nul sûr égal.
  • Objects.hashCode(Object...) - moyen simple 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 devrez l'assigner à une variable avant de le faire de manière normale).
  • CharMatchers ont déjà été mentionnés, mais ils sont très puissants.
  • Throwablesvous permet de faire de belles choses avec les objets jetables, par exemple, Throwables.propagatequi renvoie un jetable si c'est un RuntimeExceptionou un Erroret l'enveloppe dans un RuntimeExceptionet le jette autrement.

Je pourrais certainement continuer, mais je dois me mettre au travail. =) Quoi qu'il en soit, malgré ma liste de choses que j'aime ici, le fait est que tout dans Guava est utile dans une situation ou une autre. Une grande partie est utile très souvent. Au fur et à mesure que vous l'utiliserez, vous découvrirez d'autres utilisations. Ne pas l'utiliser vous donnera un peu l'impression d'avoir une main attachée dans le dos.

ColinD
la source
2
Tout à fait d'accord ComparisionChain.
whiskeysierra
44

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

Les parties que j'aime particulièrement sont:

  • Charsets.* - si simple, si utile
  • Les collections
  • Gestion des E / S (lire une ressource complètement en une seule ligne, etc.)
  • Splitter/Joiner
  • Preconditions
Jon Skeet
la source
6
Notez que nous avons maintenant StandardCharsets dans Java 7+. Je me demande combien d'autres fonctionnalités de Guava ont trouvé leur chemin dans Java.
DavidS
1
J'ai trouvé ce plugin Modernizer Maven qui détecte les utilisations des API héritées, y compris des bibliothèques tierces comme Guava. Le fichier de configuration semble contenir 67 obsolescence de Guava, y compris StandardCharsets.
DavidS
28

Je l'ai d'abord utilisé pour les collections shorthands. 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");
dogbane
la source
21

La méthode précalculée () de CharMatcher ( source ) est une belle "fonctionnalité cachée" sur laquelle je suis tombé par hasard l'autre jour.

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

C'est le genre d'optimisation cachée dont vous pouvez tirer parti lorsque vous utilisez une bibliothèque, que vous n'auriez 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();
Etienne Neveu
la source
J'ai aussi une question sur la goyave ListenableFuture . Si possible, pouvez-vous revoir ma conception et m'aider à clarifier certains de mes doutes et comment je dois y répondre? J'ai récemment commencé à travailler avec Guava ListenableFuture et j'aime beaucoup, mais j'ai une certaine confusion quant à la façon de les utiliser efficacement.
john
16

Voici une vidéo YouTube de Google (conférencier: Kevin Bourrillion, ingénieur en chef des bibliothèques Java de base de Google) qui montre la beauté des collections Google. Une chose que Google a fait, que je trouve brillante, est de garantir l' immuabilité dans les collections.

Buhake Sindi
la source
12

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

nanda
la source
8

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

  1. Nous sommes très friands des Iterators / Iterables et de l'interface Function.
  2. La famille d'interfaces Service est de grandes abstractions
  3. Nous sommes tellement engagés que nous avons commencé à utiliser les classes ImmutableXXX de nos types d'API pour communiquer qu'elle ne peut pas être modifiée.
  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, la mise en œuvre solide. Hautement recommandé.

Darren Gilroy
la source
7

MapMaker propose désormais des caches LRU limités - ce sont des machines substantielles cachées derrière une petite API. Cela a le potentiel pour une utilité énorme, et je suis toujours partout dans le code.

Dimitris Andreou
la source