2009-11-05 16 views
11

La libreria standard Java ha strutture dati funzionali, come set immutabili, elenchi, ecc., Con aggiornamento funzionale?Strutture dati funzionali in Java

+0

Vuoi una copia profonda di tutti gli oggetti nell'elenco o semplicemente una funzione che ti dà un nuovo elenco di puntatori tutti agli stessi oggetti della sorgente? –

+0

Voglio una struttura dati persistente per un Set non implementato in modo sciocco. Ad esempio, una lista immutabile potrebbe implementare l'aggiunta copiando tutti gli elementi in una nuova lista e aggiungendo l'elemento - O (n). Oppure potrebbe essere una lista collegata, aggiungere l'elemento alla testa e restituire la testa - O (1) – Claudiu

+0

non c'è un modo generale per "copiare in profondità" qualcosa in Java. –

risposta

15

Functional java ha Sets, Lists e altre astrazioni interessanti.

+3

+1 per essere l'unica risposta corretta qui. –

+0

pulito, sembra promettente. Grazie! – Claudiu

1

Sembra che tu stia cercando Scala. Si compila in .class, quindi è abbastanza buono, giusto?

+0

hmm forse. È solo che abbiamo ottenuto un codice di supporto in un corso che agisce funzionalmente (ad esempio aggiungere qualcosa a una struttura restituisce una nuova versione con l'aggiornamento), ma è scritto semplicemente copiando sempre la vecchia struttura e aggiungendo qualcosa di nuovo ad essa. mi rende triste. Mi chiedevo se esistesse un modo facile, migliore, ma immagino che Java lo renda difficile. – Claudiu

1

Non hai bisogno di scala. Basta passare la vostra collezione in:

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); 

Ho appena visto questo da un altro SO domanda:

di Google ImmutableSet

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

dalla documentazione:

differenza Collezioni .unmodifiableSet (java.util.Set), che è una vista di una raccolta separata che può ancora cambiare, un'istanza di questa classe contiene i propri dati privati ​​ e non cambierà mai . Questa classe è utile per le serie finali statiche pubbliche e consente inoltre di creare facilmente una "copia difensiva" di un set fornito alla classe da un chiamante.

modificato per includere commento.

+0

+1: eri più veloce =) Esistono tra l'altro anche 'unmodifiableList()', 'unmodifiableMap()', altri metodi disponibili nell'API 'java.util.Collections': http://java.sun.com /javase/6/docs/api/java/util/Collections.html – BalusC

+0

Voglio aggiungere qualcosa a un Set, mantenendo il vecchio Set lo stesso e restituendo un nuovo Set. Non penso che sia immodificabile. Detto questo? – Claudiu

+0

@Claudiu sì, immodificabile. Non lo farò sicuramente. –

1

Bene, ci sono due possibili approcci per "cambiare" una collezione immutabile:

  • Effettuare una copia di esso che include il "cambiamento"

  • Creare un nuovo oggetto diverso che consiste di un riferimento all'oggetto originale e un riferimento a una descrizione della modifica.

Clojure prende il secondo approccio, quindi diventa abbastanza veloce per creare un sacco di fratelli di una collezione originale con piccole correzioni, ciascuna con requisiti di memoria ragionevoli. Ma la maggior parte del codice Java tende ad andare per la prima opzione.

Per quello che vale, Google ha creato una serie di raccolte che supportano la programmazione in stile funzionale: http://code.google.com/p/google-collections/ ma non le ho guardate in profondità.

0

Le stringhe e i numeri sono immutabili in modo funzionale, ma la maggior parte delle raccolte non lo sono (le raccolte immutabili generano eccezioni su aggiungi, rimuovi, ecc.). CopyOnWriteArrayList e CopyOnWriteArraySet sono i più vicini in tal senso.

1

È sempre bello vedere Google Collections collegato, ma no, non abbiamo questo. Non conosco nessuna libreria Java che funzioni. All'interno di Google, abbiamo implementato alcune strutture List funzionali e indovina un po '? Nessuno li usa.Quindi non è probabile che diventeranno open-source in qualunque momento presto.

0

Se siete interessati in collezioni manipolazione in uno stile funzionale dare uno sguardo al lambdaj

2

Dai un'occhiata alla progetto pcollections:

PCollections serve come un analogo persistente e immutabile delle collezioni di Java Struttura. Ciò include stack, mappe, vettori, set e borse efficienti, thread-safe, generici, immutabili e persistenti, compatibili con le loro controparti Java Collections.

I tipi di dati persistenti e immutabili sono sempre più apprezzati come alternativa semplice, progettuale, compatibile con la concorrenza e talvolta più efficiente in termini di tempo e spazio ai tipi di dati mutabili.

0

So che questa è una vecchia domanda, ma un po 'di ricerca in giro mi dice che ora abbiamo un'alternativa per Java funzionale.

JavasLang si presenta come una libreria interessante per la programmazione dichiarativa e le strutture di dati funzionali in Java.

Non l'ho confrontato con Java funzionale in termini di facilità d'uso e prestazioni, ma mi piacerebbe avere qualche indicazione su questo.

Problemi correlati