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? P>
10 Réponses :
On dirait que vous recherchez Scala . Il compile de .class, donc c'est assez bon, non? P>
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.
Vous n'avez pas besoin de scala. Il suffit de transmettre votre collection dans: Je viens de voir cela à partir d'un autre alors question: p> Immuttableet de Google P> de la DOCS: P> 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. P>
blockQuote> édité pour incorporer des commentaires. p> p>
+1: Vous étiez Quickier =) Il existe également MODODIFIALLELIST () CODE>,
UNMODIFIABLEBLEMAP () CODE>, 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 code> si vous ne comprenez pas ce que je veux dire.)
Eh bien, il existe deux approches possibles pour "changer" une collection immuable: p>
en apporte une copie qui inclut le "changement" p> li>
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. P> li> ul>
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. P>
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. P>
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 code> A> et
copywridrearrayset code >
sont les plus proches de ce sens. p>
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. P>
Si vous êtes intéressé par la manipulation des collections dans un style fonctionnel, donnez un coup d'œil à Lambdaj p>
Regardez le PCollections Projet: P>
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. P>
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. p> blockQuote>
Je sais que c'est une vieille question, mais un peu de recherche me dit que nous avons maintenant une alternative pour Java fonctionnel. P>
Javaslang ressemble à une bibliothèque intéressante pour la programmation déclarative et les structures de données fonctionnelles en Java. P>
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. P>
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.