Einführung in PCollections

1. Übersicht

In diesem Artikel werden wir uns mit PCollections befassen, einer Java-Bibliothek, die dauerhafte, unveränderliche Sammlungen bereitstellt.

Persistente Datenstrukturen (Sammlungen) können während des Aktualisierungsvorgangs nicht direkt geändert werden. Stattdessen wird ein neues Objekt mit dem Ergebnis des Aktualisierungsvorgangs zurückgegeben. Sie sind nicht nur unveränderlich, sondern auch dauerhaft. Dies bedeutet, dass frühere Versionen der Sammlung nach der Änderung unverändert bleiben.

PCollections ist analog und kompatibel mit dem Java Collections Framework.

2. Abhängigkeiten

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

 org.pcollections pcollections 2.1.2 

Wenn unser Projekt Gradle-basiert ist, können wir unserer build.gradle- Datei dasselbe Artefakt hinzufügen :

compile 'org.pcollections:pcollections:2.1.2'

Die neueste Version finden Sie auf Maven Central.

3. Kartenstruktur ( HashPMap )

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

Wir können HashPMap mithilfe praktischer statischer Methoden in HashTreePMap instanziieren. Diese statischen Methoden geben eine HashPMap- Instanz zurück, die von einer IntTreePMap unterstützt wird .

Die statische empty () -Methode der HashTreePMap- Klasse erstellt eine leere HashPMap , die keine Elemente enthält - genau wie der Standardkonstruktor von java.util.HashMap :

HashPMap pmap = HashTreePMap.empty();

Es gibt zwei weitere statische Methoden, mit denen wir HashPMap erstellen können . Die singleton () -Methode erstellt eine HashPMap mit nur einem Eintrag:

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

Die from () -Methode erstellt eine HashPMap aus einer vorhandenen java.util.HashMap- Instanz (und anderen java.util.Map- Implementierungen):

Map map = new HashMap(); map.put("mkey1", "mval1"); map.put("mkey2", "mval2"); HashPMap pmap2 = HashTreePMap.from(map); assertEquals(pmap2.size(), 2);

Obwohl HashPMap einige der Methoden von java.util.AbstractMap und java.util.Map erbt , verfügt es über Methoden, die für diese Methode eindeutig sind.

Die minus () -Methode entfernt einen einzelnen Eintrag aus der Karte, während die minusAll () -Methode mehrere Einträge entfernt. Es gibt auch die Methoden plus () und plusAll () , 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 von put () auf pmap eine UnsupportedOperationException auslöst . Da PCollections-Objekte persistent und unveränderlich sind, gibt jede Änderungsoperation eine neue Instanz eines Objekts ( HashPMap ) zurück.

Kommen wir zu anderen Datenstrukturen.

4. Listenstruktur ( TreePVector und ConsPStack )

TreePVector ist ein beständiges Analogon von java.util.ArrayList, während ConsPStack das Analogon von java.util.LinkedList ist . TreePVector und ConsPStack verfügen über praktische statische Methoden zum Erstellen neuer Instanzen - genau wie HashPMap .

Die Methode empty () erstellt einen leeren TreePVector , während die Methode singleton () einen TreePVector mit nur einem Element erstellt. Es gibt auch die from () -Methode, mit der eine Instanz von TreePVector aus einer beliebigen java.util.Collection erstellt werden kann .

ConsPStack verfügt über statische Methoden mit demselben Namen, die dasselbe Ziel erreichen.

TreePVector verfügt über Methoden zum Bearbeiten. Es verfügt über die Methoden minus () und minusAll () zum Entfernen von Elementen. das Pluszeichen () und das Pluszeichen () für das Hinzufügen von Elementen.

Mit with () wird ein Element an einem angegebenen Index ersetzt, und mit subList () wird eine Reihe von Elementen aus der Auflistung abgerufen .

Diese Methoden sind auch in ConsPStack verfügbar .

Betrachten wir das folgende Codefragment, das 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 ist pSub ein weiteres TreePVector- Objekt und unabhängig von pV2 . Wie zu beobachten ist, wurde pV2 durch die Operation subList () nicht geändert . Vielmehr wurde ein neues TreePVector- Objekt erstellt und mit Elementen von pV2 von Index 0 bis 2 gefüllt .

Dies ist das, was unter Unveränderlichkeit zu verstehen ist, und dies geschieht mit allen modifizierenden Methoden von PCollections.

5. Struktur festlegen ( MapPSet )

MapPSet ist ein dauerhaftes, kartengestütztes Analogon von java.util.HashSet . Es kann bequem durch statische Methoden von HashTreePSet instanziiert werden - empty () , from () und singleton () . Sie funktionieren auf die gleiche Weise wie in den vorherigen Beispielen erläutert.

MapPSet verfügt über die Methoden plus () , plusAll () , minus () und minusAll () zum Bearbeiten von Satzdaten . Darüber hinaus erbt es Methoden von java.util.Set , java.util.AbstractCollection und java.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 noch OrderedPSet, das die Einfügereihenfolge von Elementen wie java.util.LinkedHashSet beibehält .

6. Fazit

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

Und wie immer finden Sie den vollständigen Code auf Github.