La biblioteca de Guava: ¿Cuáles son sus características más útiles y / u ocultas? [cerrado]

131

He examinado rápidamente la API de Guava y los nuevos tipos de colección que proporciona ( Multimapy, BiMappor ejemplo, parecen útiles) y estoy pensando en incluir la biblioteca en los proyectos en los que trabajo.

Sin embargo, también tengo reticencias a incluir bibliotecas de manera voluntaria si no son de gran beneficio y aprender las características desperdicia un tiempo valioso.

¿Ha incluido la biblioteca Guava en su proyecto y ha resultado útil de alguna manera inesperada? ¿Lo usarías siempre en el futuro? ¿Cuál ha sido su principal beneficio / ahorro de tiempo? ¿Cuáles son sus características ocultas?

NimChimpsky
fuente
44
Su título y su pregunta realmente no coinciden.
aioobe
44
"los nuevos tipos de colecciones ... parecen útiles" y "Tengo reticencias a incluir bibliotecas ... si no son de gran beneficio", ¿cuál es entonces? cree que la biblioteca es útil y tiene beneficios o no
matt b
A partir de 2017 (la pregunta ahora está cerrada), si está utilizando la última Gradle (4.4.1), guava 21.0 se agrega a build.gradle de forma predeterminada como una dependencia, con las palabras "Esta dependencia se usa internamente y no está expuesta a los consumidores en su propio classpath de compilación ", lo que sugiere que el equipo de Gradle ha decidido que hay algunas cosas realmente valiosas allí.
Mike roedor

Respuestas:

158

En serio, todo en Guava es útil. Lo he estado usando durante bastante tiempo y todavía siempre descubro algo nuevo que puedo hacer con él que requiere menos código que hacerlo a mano.

Algunas cosas que otros no han mencionado realmente que amo:

  • Multimaps son simplemente geniales. Cada vez que use algo como Map<Foo, Collection<Bar>>, use un multimapa en su lugar y ahórrese un montón de tediosas comprobaciones para una colección existente asignada a una clave y cree y agregue si no está allí.
  • Orderinges ideal para construir Comparators que se comporten como quieres.
  • Maps.uniqueIndexy Multimaps.index: estos métodos toman una Iterabley a Functiony construyen una ImmutableMapo ImmutableListMultimapque indexa los valores en Iterableel resultado de aplicar la función a cada uno. Entonces, con una función que recupera la ID de un artículo, puede indexar una lista de artículos por su ID en una línea.
  • El material funcional que proporciona ... filter, transformetc. A pesar de la verbosidad de uso de clases para Functions y Predicates, he encontrado esto útil. Doy un ejemplo de una manera de hacer que esto se lea bien aquí .
  • ComparisonChaines una clase pequeña, fácil de pasar por alto, que es útil cuando desea escribir un método de comparación que compare varios valores en sucesión y debe regresar cuando se encuentra la primera diferencia. Elimina todo el tedio de eso, convirtiéndolo en solo unas pocas líneas de llamadas a métodos encadenados.
  • Objects.equal(Object,Object) - nulo seguro igual.
  • Objects.hashCode(Object...) - forma fácil de obtener un código hash basado en múltiples campos de tu clase.
  • Objects.firstNonNull(Object,Object) - reduce el código para obtener un valor predeterminado si el primer valor es nulo, especialmente si el primer valor es el resultado de una llamada al método (tendría que asignarlo a una variable antes de hacerlo de la manera normal).
  • CharMatcherYa se mencionaron, pero son muy poderosos.
  • Throwablesle permite hacer algunas cosas buenas con los Throwables.propagateobjetos arrojables , como volver a lanzar un objeto arrojadizo si es un RuntimeExceptiono un Errory lo envuelve en un RuntimeExceptiony lo arroja de otra manera.

Ciertamente podría seguir, pero tengo que ir a trabajar. =) De todos modos, a pesar de haber enumerado algunas cosas que me gustan aquí, el hecho es que todo en Guava es útil en una situación u otra. Gran parte de esto es útil con mucha frecuencia. A medida que lo use, descubrirá más usos. No usarlo se sentirá un poco como tener una mano atada a la espalda.

ColinD
fuente
2
Totalmente de acuerdo ComparisionChain.
whiskeysierra
44

He estado usando efectivamente Guava durante un par de años, dentro de Google, y es maravilloso.

Las partes que me gustan especialmente son:

  • Charsets.* - Tan simple, tan útil
  • Colecciones
  • Manejo de E / S (lea un recurso completamente en una sola línea, etc.)
  • Splitter/ /Joiner
  • Preconditions
Jon Skeet
fuente
66
Tenga en cuenta que ahora tenemos StandardCharsets en Java 7+. Me pregunto cuántas otras características de Guava se han introducido en Java.
DavidS
1
Encontré este complemento Modernizer Maven que detecta usos de API heredadas, incluidas bibliotecas de terceros como Guava. El archivo de configuración parece contener 67 desvalorizaciones de guayaba, incluidos StandardCharsets.
DavidS
28

Inicialmente lo usé para colecciones shorthands. Por ejemplo, en lugar de:

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

Puedes hacerlo:

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

También es fácil poblar mapas:

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

Ahora, he descubierto algunas otras utilidades útiles presentes en Guava. Por ejemplo, la clase CharMatcher le permite unir secuencias de caracteres. Tu puedes hacer:

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

o

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

El método precomputado () de CharMatcher ( fuente ) es una buena "característica oculta" que encontré el otro día.

Realmente es solo una optimización, que crea una tabla de búsqueda (usando una matriz de bits), y luego simplemente busca caracteres para ver si "coinciden".

Es el tipo de optimización oculta que puede aprovechar cuando usa una biblioteca, que tal vez no haya pensado en su propio código.

Por supuesto, si crea un CharMatcher complejo, que planea usar muchas veces, debe recordar llamar al método precomputado (), como:

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();
Etienne Neveu
fuente
También tengo una pregunta sobre guayaba ListenableFuture . Si es posible, ¿puede revisar mi diseño y ayudarme a aclarar algunas de mis dudas y cómo debo tratarlas? Recientemente comencé a trabajar con Guava ListenableFuture y me gusta mucho, pero tengo cierta confusión sobre cómo usarlos de manera eficiente.
juan
16

Aquí hay un video de YouTube de Google (ponente: Kevin Bourrillion, ingeniero principal de las principales bibliotecas Java de Google) que muestra la belleza de Google Collections. Una cosa que hizo Google, que creo que es brillante, es garantizar la inmutabilidad en las colecciones.

Buhake Sindi
fuente
12

Google Guava es una biblioteca de utilidades, por lo que dudo que haya una clase asesina en su interior. Todo acerca de la utilidad es que casi la usas en todos los proyectos que tienes. No recuerdo ningún proyecto que haya hecho que no use la colección Java. Y la verdad es que la utilidad de recopilación de Google Guava es maravillosa y debe estar en el SDK de Java.

He escrito tres artículos sobre clases en Google Guava:

Y esto no es todo, hay muchas otras cosas que puedes hacer con Guava.

nanda
fuente
8

Absolutamente muy super útil. Es casi invariablemente la primera biblioteca agregada a un nuevo proyecto.

  1. Nos encantan los iteradores / iteradores y la interfaz de función.
  2. La familia de interfaces de servicio son grandes abstracciones
  3. Estamos tan comprometidos que hemos comenzado a usar las clases ImmutableXXX de nuestros tipos de API para comunicar que no se puede cambiar.
  4. Los mapas de computación (de MapMaker) son maravillosos en ciertas situaciones.

En general, la biblioteca es de muy alta calidad. La API está bien pensada, la implementación es sólida. Muy recomendable.

Darren Gilroy
fuente
7

MapMaker ahora ofrece memorias caché LRU limitadas, que es una maquinaria sustancial oculta detrás de una pequeña API. Esto tiene el potencial de una gran utilidad, y todavía estoy en todo el código.

Dimitris Andreou
fuente