joiner - guava google core libraries for java
Google guava vs Scala collection framework comparison (4)
Hay muchos conceptos comunes:
- colección inmutable,
- vista de colección,
- colección estricta / no estricta,
- constructores de colecciones
mismos patrones en Guava y Scala Collection API. Entonces cuál es la diferencia? ¿Ambas bibliotecas son consistentes con patrones? ¿La facilidad de extensión es suficientemente buena?
Entonces me gustaría escuchar la comparación de esos marcos de alguien que los usa a ambos.
Google Guava es una biblioteca fantástica, no hay dudas al respecto. Sin embargo, está implementado en Java y adolece de todas las restricciones que eso implica:
- Sin interfaz de colección inmutable en la biblioteca estándar
- No hay literales lambda (cierres), por lo que hay una gran repetición de los tipos de SAM necesarios para, por ejemplo, predicados
- mucha duplicación en las especificaciones de tipo, especialmente donde están involucrados los genéricos
La guayaba también tiene que existir en presencia de la biblioteca de colección estándar de Java, por lo que es raro que las bibliotecas de terceros expongan literales de funciones compatibles con guayaba o hagan uso de tipos de colección específicos de guayaba. Esto causa una falta de coincidencia de impedancia para cada biblioteca de terceros que utilice. Por ejemplo, normalmente querrá convertir colecciones devueltas de dichas bibliotecas a la colección inmutable de guava apropiada, especialmente si trabaja en un entorno multiproceso.
Las colecciones de Scala tienen un diseño que está mucho mejor integrado en el lenguaje, las encontrará ampliamente utilizadas en toda la biblioteca estándar de scala y a través de productos de terceros implementados en Scala. Las colecciones de Scala también son inmutables por defecto, por lo que terminas con un código mucho más seguro que no requiere una capa adicional de envoltura defensiva.
Si puede usar Scala, hágalo, tiene muchas ventajas además del marco de colecciones. Si tiene que usar Java, entonces Guava es una buena opción, especialmente teniendo en cuenta que las colecciones de Scala no son particularmente fáciles de usar sin las características de idioma que ofrece Scala.
En un proyecto mixto, las colecciones de Guava son perfectamente utilizables desde Scala, pero el lenguaje también proporciona mecanismos que le permiten usar colecciones de Java (incluidas las de Guava, que exponen las mismas interfaces) como si fueran colecciones propias de Scala.
He usado Scala, Google collections y F #. Últimamente he usado Iteradores de colecciones de Google y me he olvidado del poder de las expresiones de secuencia F #. Parece que Scala prefiere listas no estrictas (flojas) sobre iteradores / secuencias.
En las colecciones F # y Google (vea los Iteradores de Google), puede transformar y filtrar los iteradores creando una interesante línea de trabajo de inserción que se representa como una secuencia de objetos. No es que no puedas hacer esto en Scala simplemente no es común. F # tiene un operador de tubería frío para filtrar iteradores (secuencias).
Por ejemplo, esperaría que la expresión de rendimiento de Scala genere un iterador como Python (o bloques de secuencia F #) en su lugar, devuelve una lista.
Ambos son muy similares y Scala tiene enormes ventajas en términos de velocidad y sintaxis, pero cuando los utilizo siento (en mi opinión):
- Las colecciones de Google están enfocadas en el mapa y el iterador.
- Scala está muy enfocado en la lista.
NOTA: parece que Scala 2.8 ha realizado algunos cambios importantes en sus colecciones (utilicé una versión anterior de Scala).
Los otros ya respondieron tu pregunta, pero creo que te perdiste una alternativa interesante, la Biblioteca funcional de Java . Ignora la API de recopilación de Java y proporciona colecciones inmutables que se ven y se comportan como colecciones simplificadas de Scala.
Uso guayaba en todos mis proyectos de Java ahora. Le da un toque funcional agradable a las colecciones de Java con patrones similares.
Sin embargo, escribir cierres en java significa definir mucha clase anónima directamente, que es prolija y aburrida.
Las colecciones de Scala son aún superiores en términos de diseño (con la cascada de implementaciones parciales debido a rasgos) y funcionalidades. Es fácil crear su propia colección y obtener todas las ventajas de las colecciones scala simplemente implementando un pequeño conjunto de métodos.