10
votes

Structures de données fonctionnelles en Java

La bibliothèque standard Java dispose-t-elle de structures de données fonctionnelles, telles que des ensembles immuables, des listes, etc., avec mise à jour fonctionnelle?


3 commentaires

Voulez-vous une copie profonde de tous les objets de la liste ou simplement une fonction qui vous donne une nouvelle liste de pointeurs tous aux mêmes objets que la source?


Je veux une structure de données persistante pour un ensemble non implémenté de manière idiote. Par exemple, une liste immuable pourrait mettre en œuvre l'ajout en copiant tous les éléments dans une nouvelle liste et en ajoutant l'élément - O (n). Ou il pourrait s'agir d'une liste liée, ajoutez l'élément à la tête et renvoyez la tête - O (1)


Il n'y a pas de moyen général de "copier en profondeur" à Java.


10 Réponses :


1
votes

On dirait que vous recherchez Scala . Il compile de .class, donc c'est assez bon, non?


1 commentaires

hmm peut-être. C'est juste que nous avons reçu un certain code de soutien dans un cours qui agit fonctionnellement (c'est-à-dire ajouter quelque chose à une structure renvoie une nouvelle version avec la mise à jour), mais elle est écrite en copiant toujours l'ancienne structure et en ajoutant quelque chose de nouveau. ça me rend triste. Je me demandais s'il y avait une solution facile, meilleure, mais je suppose que Java le rend fort.



1
votes

Vous n'avez pas besoin de scala. Il suffit de transmettre votre collection dans: xxx

Je viens de voir cela à partir d'un autre alors question:

Immuttableet de Google

http://google-collections.googlecode.com/svn/trunk/ javadoc / com / google / commun / collect / immutatableset.html

de la DOCS:

Contrairement à Collections.unmodifiablulesset (java.util.set), qui est une vue d'un séparé collection qui peut toujours changer, un L'instance de cette classe contient son propres données privées et ne sera jamais monnaie. Cette classe est pratique pour Ensembles finaux statiques publics ("constante sets ») et vous permet également de faire facilement un "Copie défensive" d'un ensemble fourni à votre classe par un appelant.

édité pour incorporer des commentaires.


4 commentaires

+1: Vous étiez Quickier =) Il existe également MODODIFIALLELIST () , UNMODIFIABLEBLEMAP () , ANS PLUS MODESTES DISPONIBLES IN JAVA.UTIL.Collections < / Code> API: Java.sun.com/javase /6/docs/api/java/util/collections.html


Je veux ajouter quelque chose à un ensemble, en gardant l'ancien jeu de même, et retourner un nouvel ensemble. Je ne pense pas que Mododifiabliblibliable me donne ça?


@Claudiu Oui, la Mododidifiablesset ne fera certainement pas cela.


Immuable et non modifiable ne sont pas la même chose. Une tentative de mixte une collection non modifiable conduira à une exception runtimédia, alors que la collection immuable, une telle mutation n'est pas possible du tout et que le code est donc garanti de ne pas faire sauter au moment de l'exécution. (Regardez le code source de fj.data.list si vous ne comprenez pas ce que je veux dire.)



1
votes

Eh bien, il existe deux approches possibles pour "changer" une collection immuable:

  • en apporte une copie qui inclut le "changement"

  • créer un nouvel objet différent consiste en une référence à l'objet d'origine et une référence à une description de la modification.

    Clojure prend cette dernière approche. Il devient donc assez rapide de créer beaucoup de frères et sœurs d'une collection originale avec des corrections mineures à chacune, avec des exigences de mémoire raisonnables. Mais la plupart des codes Java ont tendance à aller pour la première option.

    Pour ce que ça vaut la peine, Google a créé une poignée de collections qui prennent en charge la programmation de type fonctionnel: http://code.google.com/p/google-Collections/ Mais je ne les ai pas regardés en profondeur.


0 commentaires

-1
votes

Jetez un coup d'œil à Google Collections .


0 commentaires

0
votes

Les chaînes et les chiffres sont immuables de manière fonctionnelle, mais la plupart des collections ne sont pas (les collections immuables lancent des exceptions sur Ajouter, supprimer, etc.). CopyOnwrriRrayListe et copywridrearrayset sont les plus proches de ce sens.


0 commentaires

15
votes

Java fonctionnel a définit, répertorie et des abstractions plus intéressantes.


0 commentaires

1
votes

C'est toujours agréable de voir Google Collections branchées, mais non, nous n'avons pas cela. Je ne connais aucune bibliothèque Java qui fait. À l'intérieur de Google, nous avons mis en place des structures de liste fonctionnelle et devinons quoi? Personne ne les utilise. Donc, ils ne sont probablement pas susceptibles de devenir ouverts à aucun moment.


0 commentaires

0
votes

Si vous êtes intéressé par la manipulation des collections dans un style fonctionnel, donnez un coup d'œil à Lambdaj


0 commentaires

2
votes

Regardez le PCollections Projet:

Pcollections sert d'analogue persistant et immuable du cadre de collections Java. Cela inclut des piles, des cartes, des vecteurs, des jeux et des sacs, des jeux et des sacs, compatibles avec leurs homologues de collections Java.

Les datatypes persistants et immuables sont de plus en plus appréciés comme une alternative simple, conviviale, adaptée aux conceptions, et parfois plus de temps et plus efficaces à des types de données mutables.


0 commentaires

1
votes

Je sais que c'est une vieille question, mais un peu de recherche me dit que nous avons maintenant une alternative pour Java fonctionnel.

Javaslang ressemble à une bibliothèque intéressante pour la programmation déclarative et les structures de données fonctionnelles en Java.

Je ne l'ai pas comparé avec Java fonctionnel en termes de facilité d'utilisation et de performance, mais j'aimerais avoir des indications sur cela.


0 commentaires