2010-09-21 26 views
122

He tenido un escaneo rápido de Guava API y los nuevos tipos de colección que proporciona (Multimap y BiMap por ejemplo parecen útiles) y estoy pensando en incluir la biblioteca en el proyecto (s)) Yo trabajo en. Sin embargo, también tengo la reticencia de incluir bibliotecas de cualquier forma si no son de gran beneficio y aprender las funciones pierde un tiempo valioso.La biblioteca de Guava para Java; ¿Cuáles son sus características más útiles y/u ocultas

¿Ha incluido la biblioteca Guava en su proyecto y ha demostrado ser útil de forma 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?

+4

Su título y su pregunta realmente no coinciden. – aioobe

+4

"los nuevos tipos de colección ... parecen útiles" y "Tengo una reticencia para incluir bibliotecas ... si no son de gran beneficio" - ¿y entonces qué es? o bien cree que la biblioteca es útil y tiene beneficios o no –

+0

A partir de 2017 (pregunta ahora cerrada), si está utilizando el último Gradle (4.4.1), se agrega guava 21.0 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 propia ruta de compilación", lo que sugiere que el equipo de Gradle ha decidido que hay algunas cosas realmente valiosas allí. –

Respuesta

152

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

Algunas cosas que otros no han realmente mencionados que amo:

  • Multimap s son simplemente genial. Cada vez que utilice algo como Map<Foo, Collection<Bar>>, use un multimapa en su lugar y ahórrese una tonelada de tediosa comprobación de una colección existente asignada a una clave y crear y agregarla si no está allí.
  • Ordering es ideal para la construcción de Comparator s que se comportan exactamente como usted desea.
  • Maps.uniqueIndex y Multimaps.index: estos métodos toman un Iterable y una Function y construir un ImmutableMap o ImmutableListMultimap que los índices de los valores de la Iterable por el resultado de aplicar la función a cada uno. Entonces, con una función que recupera el ID de un artículo, puede indexar una lista de elementos por su ID en una línea.
  • Lo funcional que proporciona ... filter, transform, etc. A pesar de la verbosidad de utilizar clases para Function sy Predicate s, me pareció útil. Doy un ejemplo de una forma de hacer que esto lea bien here.
  • ComparisonChain es una clase pequeña, que se pasa por alto fácilmente, que es útil cuando se quiere escribir un método de comparación que compara varios valores en sucesión y debe devolver cuando se encuentra la primera diferencia. Elimina todo el tedio de eso, por lo que es solo unas pocas líneas de llamadas encadenadas.
  • Objects.equal(Object,Object) - nulo seguro es igual a.
  • Objects.hashCode(Object...) - forma fácil de obtener un código de hash basado en múltiples campos de su 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 a método (tendría que asignarlo a una variable antes de hacer esto de la manera normal) .
  • CharMatcher s ya se mencionaron, pero son muy potentes.
  • Throwables le permite hacer algunas cosas buenas con throwables, como Throwables.propagate cuales regenera un error throwable si es un RuntimeException o un Error y lo envuelve en un RuntimeException y arroja que de otro modo.

Sin duda 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 u otra situación. Gran parte de esto es útil muy a menudo. A medida que lo use, descubrirá más usos. No usarlo se sentirá un poco como tener una mano atada a la espalda.

+2

Totalmente de acuerdo en 'ComparisionChain'. – whiskeysierra

42

He estado utilizando efectivamente la guayaba durante un par de años, dentro de Google, y es maravilloso.

Las partes Estoy particularmente aficionado son:

  • Charsets.* - tan simple, tan útil
  • Colecciones manejo
  • IO (leer un recurso totalmente en una sola línea, etc.)
  • Splitter/Joiner
  • Preconditions
+5

Tenga en cuenta que ahora tenemos [StandardCharsets] (https://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html) en Java 7+. Me pregunto cuántas otras características de la Guava han encontrado su camino en Java. – DavidS

+0

Encontré este [Modernizer Maven Plugin] (https://github.com/andrewgaul/modernizer-maven-plugin) que detecta el uso de API heredadas, incluidas bibliotecas de terceros como Guava. El [archivo de configuración] (https://github.com/andrewgaul/modernizer-maven-plugin/blob/master/src/main/resources/modernizer.xml) parece contener 67 desacatos de Guava, incluidos StandardCharsets. – DavidS

12

Google Guava es una biblioteca de utilidades, así que dudo que haya una clase asesina dentro. Todo sobre la utilidad es que casi lo 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 recolección de Google Guava es maravillosa y debería estar en el SDK de Java.

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

Y esto no es todo, hay muchas otras cosas que puedes hacer w con guayaba

16

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

27

Lo usé inicialmente para colecciones de manos cortas.Por ejemplo, en lugar de:

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

usted puede hacer esto:

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

También es fácil para poblar mapas:

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

Ahora, he descubierto algunas otras utilidades de interés presentes en Guayaba. Por ejemplo, la clase CharMatcher le permite unir secuencias de caracteres. Se puede hacer:

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

o

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

El método precalculado() de CharMatcher (source) es una buena "función oculta" que encontré el otro día.

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

Es el tipo de optimización oculta que puede aprovechar cuando utiliza una biblioteca, que quizás no haya pensado en su propio código.

Por supuesto, si crea un CharMatcher complejo, que tiene previsto utilizar muchas veces, hay que acordarse de llamar al método precomputed(), como:

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

También tengo una pregunta sobre guava [ListenableFuture] (http://stackoverflow.com/questions/29336280/how-to-properly-deal-with-exceptions-coming-from-listenablefuture-guava).Si es posible, ¿puede revisar mi diseño y ayudarme a aclarar algunas de mis dudas y cómo debería lidiar con ellas? Recientemente comencé a trabajar con Guava ListenableFuture y me gusta mucho, pero tengo cierta confusión con respecto a cómo usarlos de manera eficiente. – john

8

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

  1. Estamos muy encariñados con Iterators/Iterables 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 de ImmutableXXX nuestros tipos de API para comunicar que no se puede cambiar.
  4. Los mapas informáticos (de MapMaker) son maravillosos en ciertas situaciones.

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

7

MapMaker ahora ofrece cachés de LRU limitados, esa es una maquinaria sustancial escondida detrás de una pequeña API. Esto tiene el potencial para una gran utilidad, y todavía estoy por todo el código.

Cuestiones relacionadas