Verfügt die Java-Standardbibliothek über funktionale Datenstrukturen wie unveränderbare Sätze, Listen usw. mit funktionalem Update?Funktionale Datenstrukturen in Java
Antwort
Functional java hat Sets, Lists und weitere interessante Abstraktionen.
+1 für die einzig richtige Antwort hier. –
ordentlich, das sieht vielversprechend aus. Vielen Dank! – Claudiu
Klingt, als ob Sie nach Scala suchen. Es kompiliert nach .class, also ist das gut genug, oder?
hmm vielleicht. Es ist nur so, dass wir einen Unterstützungscode in einem Kurs bekommen, der funktional funktioniert (d. H. Etwas zu einer Struktur hinzuzufügen gibt eine neue Version mit dem Update zurück), aber es wird geschrieben, indem einfach immer die alte Struktur kopiert und etwas Neues hinzugefügt wird. es macht mich traurig. Ich fragte mich, ob es einen einfachen, besseren Weg gab, aber ich denke, Java macht es nur schwer. – Claudiu
Sie brauchen keine Skala. Übergeben Sie einfach Ihre Sammlung 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);
Ich sah nur diese aus einem anderen SO Frage:
Googles ImmutableSet
aus der Dokumentation:
Im Gegensatz zu Kollektionen .unmodiableSet (java.util.Set), ist eine Ansicht einer separaten Sammlung, die sich noch ändern kann, eine Instanz dieser Klasse enthält ihre eigenen privaten Daten und wird nie ändern. Diese Klasse ist praktisch für öffentliche statische endgültige Sets ("Konstante Sets") und können Sie auch einfach eine "defensive Kopie" eines Satzes zu Ihre Klasse von einem Anrufer gemacht machen.
bearbeitet, um Kommentar aufzunehmen.
+1: Sie waren quickier =) Es gibt übrigens auch 'unmodiableList()', 'unmodifyableMap()', und weitere Methoden in 'java.util.Collections' API: http://java.sun.com /javase/6/docs/api/java/util/Collections.html – BalusC
Ich möchte etwas zu einem Set hinzufügen, das alte Set beibehalten und ein neues Set zurückgeben. Ich denke nicht, dass unmodifizierbares Set mir das gibt? – Claudiu
@Claudiu ja, unmodifizierbareSet wird das sicher nicht tun. –
Nun gibt es zwei mögliche Ansätze für eine unveränderliche Sammlung „Ändern“:
Machen Sie eine Kopie davon, die die „change“ ein neues, anderes Objekt erstellen
enthält, die besteht eines Verweises auf das ursprüngliche Objekt und einen Verweis auf eine Beschreibung der Änderung.
Clojure nimmt den zweiten Ansatz, so wird es ziemlich schnell eine Menge Geschwister einer ursprünglichen Sammlung mit geringfügigen Korrekturen jeweils mit angemessenen Speicheranforderungen zu erstellen. Aber der meiste Java-Code neigt dazu, für die erste Option zu gehen.
Für was es wert ist, hat Google eine Handvoll Sammlungen erstellt, die funktionale Programmierung unterstützen: http://code.google.com/p/google-collections/, aber ich habe sie nicht in der Tiefe betrachtet.
Werfen Sie einen Blick auf Google collections.
Strings und Zahlen sind auf eine funktionale Art unveränderlich, aber die meisten Sammlungen sind nicht (die unveränderlichen Sammlungen werfen Ausnahmen beim Hinzufügen, Entfernen, usw.). CopyOnWriteArrayList
und CopyOnWriteArraySet
sind in diesem Sinne am nächsten.
Es ist immer schön, Google Collections zu sehen, aber nein, das haben wir nicht. Ich kenne keine Java-Bibliothek, die das tut. In Google haben wir einige funktionale Listenstrukturen implementiert und raten Sie mal, was? Niemand benutzt sie.Daher werden sie in naher Zukunft wahrscheinlich nicht als Open-Source-Anbieter auftreten.
Wenn Sie in einer Sammlung Manipulation in einem funktionalen Stil Interesse gibt einen Blick auf lambdaj
Werfen Sie einen Blick auf das pcollections Projekt:
PCollections dient als persistent und unveränderlich Analog des Java Collections Rahmen. Dazu gehören effiziente, threadsichere, generische, unveränderliche und persistente Stacks, Karten, Vektoren, Sets und Taschen, die mit ihren Java-Collections-Pendants kompatibel sind.
Persistente und unveränderliche Datentypen werden zunehmend als einfache, designfreundliche, gleichzeitig nutzungsfreundliche und manchmal zeit- und platzsparende Alternative zu veränderlichen Datentypen geschätzt.
Ich weiß, dass dies eine alte Frage ist, aber ein bisschen Suchen sagt mir, dass wir jetzt eine Alternative für Functional Java haben.
JavasLang sieht aus wie eine interessante Bibliothek für deklarative Programmierung und funktionale Datenstrukturen in Java.
Ich habe es nicht mit Functional Java in Bezug auf Benutzerfreundlichkeit und Leistung verglichen, aber ich würde gerne irgendwelche Hinweise darauf bekommen.
Möchten Sie eine tiefe Kopie aller Objekte in der Liste oder einfach eine Funktion, die Ihnen eine neue Liste von Zeigern alle auf die gleichen Objekte wie die Quelle gibt? –
Ich möchte eine persistente Datenstruktur für ein Set nicht auf eine dumme Weise implementiert werden. Eine unveränderbare Liste könnte beispielsweise das Hinzufügen implementieren, indem alle Elemente in eine neue Liste kopiert und das Element - O (n) hinzugefügt wird. Oder es könnte eine verkettete Liste sein, das Element zum Kopf hinzufügen und den Kopf zurückgeben - O (1) – Claudiu
Es gibt keine allgemeine Möglichkeit, irgendetwas in Java "zu vervielfältigen". –