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?
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:
Multimap
s 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 Comparator
s 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.filter
, transform
, etc. Malgré la verbosité de l'utilisation des classes pour Function
s et Predicate
s, 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).CharMatcher
s 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.
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 utileSplitter
/Joiner
Preconditions
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");
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();
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.
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:
CheckedFuture
: http://blog.firdau.si/2010/07/07/guava-using-checkedfuture/ListenableFuture
: http://blog.firdau.si/2010/07/05/guava-using-listenablefuture/ComputingMap
sur Google Collection (maintenant Guava) http://blog.firdau.si/2009/11/13/computing-map-on-google-collections/Et ce n'est pas tout, il y a beaucoup d'autres choses que vous pouvez faire avec la goyave.
Absolument très super utile. C'est presque toujours la première bibliothèque ajoutée à un nouveau projet.
Dans l'ensemble, la bibliothèque est de très haute qualité. L'API est bien pensée, l'implémentation solide. Hautement recommandé.
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.