2009-11-05 13 views
11

¿Tiene la biblioteca estándar de Java alguna estructura de datos funcional, como conjuntos inmutables, listas, etc., con actualización funcional?Estructuras de datos funcionales en Java

+0

¿Desea una copia profunda de todos los objetos de la lista o simplemente una función que le proporcione una nueva lista de punteros a los mismos objetos que la fuente? –

+0

Quiero una estructura de datos persistente para un conjunto no implementado de una manera tonta. Por ejemplo, una lista inmutable podría implementar agregando copiando todos los elementos en una nueva lista y agregando el elemento - O (n). O podría ser una lista vinculada, agregar el elemento al encabezado y devolver el encabezado: O (1) – Claudiu

+0

, no existe una forma general de "copiar en profundidad" nada en Java. –

Respuesta

15

Functional java tiene Sets, Lists y abstracciones más interesantes.

+3

+1 por ser la única respuesta correcta aquí. –

+0

ordenado, esto parece prometedor. ¡Gracias! – Claudiu

1

Parece que está buscando Scala. Se compila para .class, así que es suficiente, ¿verdad?

+0

hmm quizás. Es solo que obtuvimos un código de soporte en un curso que funciona de manera funcional (es decir, agregar algo a una estructura devuelve una nueva versión con la actualización), pero está escrito simplemente copiando la estructura anterior y añadiéndole algo nuevo. Eso me hace triste. Me preguntaba si había una manera fácil, mejor, pero creo que Java solo lo hace difícil. – Claudiu

1

No necesita scala. Sólo tiene que pasar su colección en:

java.util.Collections.unmodifiableCollection(/* Collection<? extends T> c */); 
java.util.Collections.unmodifiableSet(Set s); 
java.util.Collections.unmodifiableMap(Map m); 
java.util.Collections.unmodifiableList(List l); 

acabo de ver esto desde otro SO pregunta:

de Google ImmutableSet

http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html

de los documentos:

A diferencia Colecciones .unmodifiableSet (java.util.Set), que es una vista de una colección separada que aún puede cambiar, una instancia de esta clase contiene sus propios datos privados y nunca cambiará . Esta clase es conveniente para los conjuntos finales estáticos públicos ("conjuntos constantes") y también le permite hacer fácilmente una "copia defensiva" de un conjunto proporcionado por su interlocutor a .

editado para incorporar comentario.

+0

+1: Usted fue más rápido =) También hay '' unmodifiableList() ',' unmodifiableMap() ', y más métodos disponibles en la API' java.util.Collections': http://java.sun.com /javase/6/docs/api/java/util/Collections.html – BalusC

+0

Quiero agregar algo a un conjunto, mantener el mismo conjunto anterior y devolver un nuevo conjunto. No creo que no modificable. Set me da eso? – Claudiu

+0

@Claudiu sí, unmodifiableSet definitivamente no hará eso. –

1

Bueno, hay dos enfoques posibles para "Cambio" una colección inmutable:

  • Haga una copia de la misma que incluye el "cambio"

  • Crear un nuevo objeto, diferente, que consiste de una referencia al objeto original y una referencia a una descripción del cambio.

Clojure toma el último enfoque, o sea que es bastante rápido para crear una gran cantidad de hermanos de una colección original con correcciones menores en cada una, con los requisitos de memoria razonables. Pero la mayoría del código Java tiende a ir por la primera opción.

Por lo que vale, Google ha creado un puñado de colecciones que admiten la programación de estilo funcional: http://code.google.com/p/google-collections/ pero no las he analizado en profundidad.

0

Las cadenas y los números son inmutables de una manera funcional, pero la mayoría de las colecciones no lo son (las colecciones inmutables arrojan excepciones en agregar, eliminar, etc.). CopyOnWriteArrayList y CopyOnWriteArraySet son los más cercanos en ese sentido.

1

Siempre es bueno ver Google Collections enchufado, pero no, no tenemos esto. No sé de ninguna biblioteca de Java que lo haga. Dentro de Google, implementamos algunas estructuras de listas funcionales, ¿y adivinen qué? Nadie los usa.Por lo tanto, no es probable que se conviertan en fuentes abiertas en el corto plazo.

0

Si usted está interesado en las colecciones de la manipulación con un estilo funcional dar un vistazo a lambdaj

2

Tener un vistazo a la pcollections proyecto:

PCollections sirve como un análogo persistente e inmutable de las colecciones de Java Marco de referencia. Esto incluye pilas, mapas, vectores, conjuntos y bolsas eficientes, seguros para hilos, genéricos, inmutables y persistentes, compatibles con sus homólogos de colecciones Java.

Los tipos de datos permanentes e inmutables son cada vez más apreciados como una alternativa simple, amigable con el diseño, amigable con la concurrencia y, a veces más eficiente en tiempo y espacio, a los tipos de datos mutables.

0

Sé que esta es una vieja pregunta, pero un poco de búsqueda me dice que ahora tenemos una alternativa para Java funcional.

JavasLang parece una biblioteca interesante para la programación declarativa y las estructuras de datos funcionales en Java.

No lo he comparado con Functional Java en términos de facilidad de uso y rendimiento, pero me gustaría obtener algunos consejos sobre eso.

Cuestiones relacionadas