2011-12-22 7 views
13

Me gustaría utilizar Java funcional o Guava (o menos probable Scala) en un curso que enseñaré. Aunque hay muchos lenguajes funcionales que se ejecutan en la JVM, me gustaría mantener algo que se parece tanto a Java como sea posible, es decir, algo que sea más compatible, conceptual y sintácticamente, con las características funcionales esperadas en Java 8¿Hay una buena comparación entre Functional Java y Guava?

Parece que Functional Java y Guava son los mejores candidatos. No he podido encontrar nada que los compare en términos de capacidades, facilidad de uso, cercanía conceptual con Java directa, etc. ¿Alguien sabe de una buena comparación entre estas bibliotecas?

+1

¿Cuál es la pregunta aquí? Es posible que desee editar su Q para que quede más claro lo que está preguntando ... \ [edit \] La Q está en el título, sí, pero es posible que desee reformularla en la Q misma. – BenCole

+2

Guava es solo una biblioteca de Java con muchos métodos útiles de utilidad. Sí, tiene algunas cosas que le permitirán programar de una manera funcional, pero en realidad no se centra especialmente en la programación funcional. – Jesper

+0

Gracias por las respuestas a continuación. Había entendido mal los objetivos de la guayaba. También dediqué un poco más de tiempo a ver Java funcional. También (todavía) está agobiado por la sintaxis de Java actual. Esto me lleva ahora a inclinarme hacia Scala. Me doy cuenta de que Scala se está volviendo más y más corriente. Aun así, creo que sería más valioso para la mayoría de los estudiantes aprender a hacer programación funcional en Java directo. (Cuando enseñamos programación funcional como un "paradigma" usamos Haskell. Dudo que los estudiantes aprendan lo suficiente, aunque para meterlo en su sangre). Esto lleva a la pregunta: ¿cuándo se espera Java 8? – RussAbbott

Respuesta

17

El objetivo de Guava no es proporcionar expresiones funcionales en Java. Desde la página wiki Functional Explained Guayaba:

El uso excesivo de los idiomas de programación funcional de la guayaba puede conducir a código prolijo, confuso e ilegible, e ineficiente. Estos son por mucho las partes más fáciles (y más comúnmente) abusadas de guayaba, y cuando se pone en longitudes absurdas para hacer que su código sea "de una sola línea", el equipo Guava llora.

Al utilizar las utilidades funcionales de Guava, asegúrese de que la manera tradicional de hacer las cosas no sea más legible. Pruebe escribiéndolo. ¿Eso fue tan malo? ¿Era más legible que el enfoque funcional absurdamente extraño de que estabas a punto de probar?

Apoyarse demasiado en las expresiones funcionales no tiene demasiado sentido para Java 7 ya que la sobrecarga es demasiado alta (consulte vertical problem). Esto cambiará con Java 8, que cambiará la forma en que se diseñan las bibliotecas y los programas de Java en el nivel de detalle. Las cosas que tienen sentido en Java hasta 7 serán desalentadas hasta cierto punto en Java 8. Esto motivará una nueva edición de Effective Java y muchas nuevas API.

Si intenta enseñar programación funcional, probablemente sea mejor seguir un lenguaje funcional (más o menos) puro. Cada lenguaje que es una mezcla (o emulación) de FP y OOP será una distracción.

+3

También debo señalar la oración anterior en ese artículo: "A partir de Java 7, la programación funcional en Java solo puede ser aproximada mediante el uso incómodo y detallado de clases anónimas. Esto se espera que cambie en Java 8, pero la Guava es actualmente dirigido a usuarios de Java 5 y superiores ". –

6

Como se indicó anteriormente, Guava es solo una biblioteca de Java, una biblioteca compatible con Java 5, incluso (a partir de la versión 11). La posición de Guava en la programación funcional es resumida por Kevin Bourrillion:

"La sintaxis apesta. Al mismo tiempo, esto es ahora, siempre ha sido y siempre será una medida provisional hasta que se produzca el cambio de idioma correcto, momento en el que finalmente podemos decidir la sintaxis óptima y comenzar la programación de estilo funcional en realidad, mejorar vidas en Java por una vez. Así que estoy indeciso sobre cuánto esfuerzo poner en las funciones/predicar cosas; está en la biblioteca más porque tiene que serlo, no tanto porque creemos que es una joya de la corona. "

4

Dado que Guava es más una biblioteca de propósito general que tiene expresiones funcionales, y Java funcional es puramente sobre la implementación de modismos funcionales en Java, Functional Java suena como un mejor ajuste con probablemente un conjunto más completo de características tipo FP.

Por otro lado, prefiero Guava porque es más general, y por lo tanto, me encuentro utilizando varias de las funciones que no están relacionadas con las expresiones funcionales.

Uno de los problemas con ambas bibliotecas (como se indica en la Wiki de Guava en las publicaciones anteriores) es el "ruido vertical" de las clases internas anónimas para sus objetos funcionales. Otra biblioteca que intenta arreglar esto mediante anotaciones y el APT es Jedi.

Otro enfoque que hace que cualquiera de las bibliotecas anteriores (Guava, FJ o Jedi) sea menos ruidosa sin anotaciones es una biblioteca que escribí, Funcito, inspirada en la sintaxis de Mockito. Es más limitado en lo que puede simplificar en este punto, esencialmente envolviendo llamadas de método único, pero eso es lo que actualmente me encuentro haciendo la mayoría del tiempo.

+0

Cuando te refieres al ruido vertical. ¿Estás hablando de la codificación detallada en lo que se refiere a agregar las clases internas anónimas o la sobrecarga en las bibliotecas de tu jar para crear un grupo de esos archivos de clase bytecode? –

+0

Lo primero: clases internas anónimas. –

Cuestiones relacionadas