Einführung in PCollections

Einführung in PCollections

1. Überblick

In diesem Artikel betrachten wirPCollections, aJava library providing persistent, immutable collections.

Die Strukturen (Sammlungen) vonPersistent datakönnen nicht direkt während des Aktualisierungsvorgangs geändert werden. Stattdessen wird ein neues Objekt mit dem Ergebnis des Aktualisierungsvorgangs zurückgegeben. Sie sind nicht nur unveränderlich, sondern auch persistent - was bedeutet, dassafter modification is performed, previous versions of the collection remain unchanged.

PCollections ist analog und kompatibel mit dem Java Collections Framework.

2. Abhängigkeiten

Fügen wir unserenpom.xml die folgende Abhängigkeit hinzu, damit wir PCollections in unserem Projekt verwenden können:


    org.pcollections
    pcollections
    2.1.2

Wenn unser Projekt auf Gradle basiert, können wir dasselbe Artefakt zu unsererbuild.gradle-Datei hinzufügen:

compile 'org.pcollections:pcollections:2.1.2'

Die neueste Version finden Sie unterMaven Central.

3. Kartenstruktur (HashPMap)

HashPMap ist eine persistente Kartendatenstruktur. Es ist das Analogon fürjava.util.HashMap, das zum Speichern von Nicht-Null-Schlüsselwertdaten verwendet wird.

Wir könnenHashPMap instanziieren, indem wir bequeme statische Methoden inHashTreePMap. verwenden. Diese statischen Methoden geben eineHashPMap-Instanz zurück, die vonIntTreePMap. unterstützt wird

Die statischeempty()-Methode derHashTreePMap-Klasse erstellt ein leeresHashPMap ohne Elemente - genau wie der Standardkonstruktor vonjava.util.HashMap:

HashPMap pmap = HashTreePMap.empty();

Es gibt zwei weitere statische Methoden, mit denen wirHashPMap erstellen können. Die Methodesingleton() erstellt einHashPMap mit nur einem Eintrag:

HashPMap pmap1 = HashTreePMap.singleton("key1", "value1");
assertEquals(pmap1.size(), 1);

Die Methodefrom() erstellt einHashPMap aus einer vorhandenenjava.util.HashMap-Instanz (und anderenjava.util.Map-Implementierungen):

Map map = new HashMap();
map.put("mkey1", "mval1");
map.put("mkey2", "mval2");

HashPMap pmap2 = HashTreePMap.from(map);
assertEquals(pmap2.size(), 2);

ObwohlHashPMap einige der Methoden vonjava.util.AbstractMap undjava.util.Map erbt, gibt es Methoden, die für sie eindeutig sind.

Die Methodeminus() entfernt einen einzelnen Eintrag aus der Karte, während die MethodeminusAll()mehrere Einträge entfernt. Es gibt auch die Methodenplus() undplusAll(), mit denen einzelne bzw. mehrere Einträge hinzugefügt werden:

HashPMap pmap = HashTreePMap.empty();
HashPMap pmap0 = pmap.plus("key1", "value1");

Map map = new HashMap();
map.put("key2", "val2");
map.put("key3", "val3");
HashPMap pmap1 = pmap0.plusAll(map);

HashPMap pmap2 = pmap1.minus("key1");

HashPMap pmap3 = pmap2.minusAll(map.keySet());

assertEquals(pmap0.size(), 1);
assertEquals(pmap1.size(), 3);
assertFalse(pmap2.containsKey("key1"));
assertEquals(pmap3.size(), 0);

Es ist wichtig zu beachten, dass das Aufrufen vonput() aufpmap einUnsupportedOperationException. auslöst. Da PCollections-Objekte persistent und unveränderlich sind, gibt jede Änderungsoperation eine neue Instanz eines Objekts zurück (HashPMap). .

Schauen wir uns andere Datenstrukturen an.

4. Listenstruktur (TreePVector and ConsPStack)

TreePVector ist ein beständiges Analogon vonjava.util.ArrayList, währendConsPStack das Analogon vonjava.util.LinkedList ist. TreePVector undConsPStack verfügen über praktische statische Methoden zum Erstellen neuer Instanzen - genau wieHashPMap.

Die Methodeempty() erstellt ein leeresTreePVector, während die Methodesingleton() einTreePVector mit nur einem Element erstellt. Es gibt auch die Methodefrom(), mit der eine Instanz vonTreePVector ausjava.util.Collection erstellt werden kann.

ConsPStack hat statische Methoden mit demselben Namen, die dasselbe Ziel erreichen.

TreePVector verfügt über Methoden zur Manipulation. Es verfügt über die Methodenminus() undminusAll() zum Entfernen von Elementen. dieplus() undplusAll() für die Zugabe von Elementen.

Mitwith() wird ein Element an einem bestimmten Index ersetzt, und mitsubList() wird eine Reihe von Elementen aus der Sammlung abgerufen.

Diese Methoden sind auch inConsPStack verfügbar.

Betrachten wir den folgenden Codeausschnitt, der die oben genannten Methoden veranschaulicht:

TreePVector pVector = TreePVector.empty();

TreePVector pV1 = pVector.plus("e1");
TreePVector pV2 = pV1.plusAll(Arrays.asList("e2", "e3", "e4"));
assertEquals(1, pV1.size());
assertEquals(4, pV2.size());

TreePVector pV3 = pV2.minus("e1");
TreePVector pV4 = pV3.minusAll(Arrays.asList("e2", "e3", "e4"));
assertEquals(pV3.size(), 3);
assertEquals(pV4.size(), 0);

TreePVector pSub = pV2.subList(0, 2);
assertTrue(pSub.contains("e1") && pSub.contains("e2"));

TreePVector pVW = (TreePVector) pV2.with(0, "e10");
assertEquals(pVW.get(0), "e10");

Im obigen Code-Snippet istpSub ein weiteresTreePVector-Objekt und unabhängig vonpV2. Wie beobachtet werden kann, wurdepV2 durch die OperationsubList() nicht verändert; Vielmehr wurde ein neuesTreePVector-Objekt erstellt und mit Elementen vonpV2 vom Index 0 bis 2 gefüllt.

Das ist es, was unter Unveränderlichkeit zu verstehen ist und was mit allen modifizierenden Methoden von PCollections passiert.

5. Struktur festlegen (MapPSet)

MapPSet ist ein beständiges, kartengestütztes Analogon vonjava.util.HashSet. Es kann bequem durch statische Methoden vonHashTreePSet –empty(),from() undsingleton() instanziiert werden. Sie funktionieren auf die gleiche Weise wie in den vorherigen Beispielen erläutert.

MapPSet hatplus(),plusAll(),minus() undminusAll() Methoden zum Bearbeiten von Satzdaten. Darüber hinaus erbt es Methoden vonjava.util.Set,java.util.AbstractCollection undjava.util.AbstractSet:

MapPSet pSet = HashTreePSet.empty()
  .plusAll(Arrays.asList("e1","e2","e3","e4"));
assertEquals(pSet.size(), 4);

MapPSet pSet1 = pSet.minus("e4");
assertFalse(pSet1.contains("e4"));

Schließlich gibt es nochOrderedPSet - wodurch die Einfügereihenfolge von Elementen genau wie beijava.util.LinkedHashSet beibehalten wird.

6. Fazit

Abschließend haben wir in diesem kurzen Lernprogramm PCollections untersucht - die persistenten Datenstrukturen, die den in Java verfügbaren Kernsammlungen entsprechen. Natürlich bietet die PCollectionsJavadoc mehr Einblick in die Feinheiten der Bibliothek.

Und wie immer kann der vollständige Codeover on Github gefunden werden.