Bevezetés a PC-gyűjteményekbe

1. Áttekintés

Ebben a cikkben megvizsgáljuk a PCollections, a Java könyvtár, állandó, változhatatlan gyűjteményeket biztosít.

Az állandó adatstruktúrákat (gyűjteményeket) nem lehet közvetlenül módosítani a frissítési művelet során, inkább egy új objektumot ad vissza a frissítési művelet eredménye. Nem csak megváltoztathatatlanok, hanem kitartók is - ami azt jelenti a módosítás végrehajtása után a gyűjtemény korábbi verziói változatlanok maradnak.

A PCollections analóg és kompatibilis a Java Collections keretrendszerrel.

2. Függőségek

Adjuk hozzá a következő függőséget a mi pom.xml hogy a PCollections-t felhasználhassuk projektünkben:

 org.pcollections pcollections 2.1.2 

Ha a projektünk Gradle alapú, akkor hozzáadhatjuk ugyanazt a tárgyat a projektünkhöz épít.gradle fájl:

fordítsd le az 'org.pcollections: pcollections: 2.1.2'

A legújabb verzió megtalálható a Maven Central oldalon.

3. Térkép felépítése (HashPMap)

HashPMap állandó térképi adatstruktúra. Ez az analóg java.util.HashMap nem null, kulcsértékű adatok tárolására szolgál.

Instantálhatunk HashPMap kényelmes statikus módszerek alkalmazásával HashTreePMap. Ezek a statikus módszerek a HashPMap példány, amelyet egy IntTreePMap.

A statikus üres() módszere HashTreePMap osztály üreset hoz létre HashPMap amelynek nincsenek elemei - csakúgy, mint a java.util.HashMap:

HashPMap pmap = HashTreePMap.empty ();

Két másik statikus módszer létezik, amelyeket létrehozhatunk HashPMap. A szingli() módszer létrehozza a HashPMap csak egy bejegyzéssel:

HashPMap pmap1 = HashTreePMap.singleton ("kulcs1", "érték1"); assertEquals (pmap1.size (), 1);

A tól től() módszer létrehozza a HashPMap egy létezőtől java.util.HashMap példány (és egyéb java.util.Térkép megvalósítások):

Térképtérkép = új HashMap (); map.put ("mkey1", "mval1"); map.put ("mkey2", "mval2"); HashPMap pmap2 = HashTreePMap.from (térkép); assertEquals (pmap2.size (), 2);

Habár HashPMap a módszerek egy részét örökli java.util.AbstractMap és java.util.Térkép, egyedülálló módszerei vannak.

A mínusz() metódus eltávolít egyetlen bejegyzést a térképről, míg a minusAll () módszer több bejegyzést eltávolít. Ott van még a plusz() és plusAll () módszerek, amelyek egy vagy több bejegyzést adnak hozzá:

HashPMap pmap = HashTreePMap.empty (); HashPMap pmap0 = pmap.plus ("kulcs1", "érték1"); Térképtérkép = új HashMap (); map.put ("key2", "val2"); map.put ("key3", "val3"); HashPMap pmap1 = pmap0.plusAll (térkép); HashPMap pmap2 = pmap1.minus ("kulcs1"); HashPMap pmap3 = pmap2.minusAll (map.keySet ()); assertEquals (pmap0.size (), 1); assertEquals (pmap1.size (), 3); assertFalse (pmap2.containsKey ("kulcs1")); assertEquals (pmap3.size (), 0);

Fontos megjegyezni, hogy hívás put () tovább pmap dobni fog egy UnsupportedOperationException. Mivel a PCollections objektumok tartósak és változhatatlanok, minden módosító művelet egy objektum új példányát adja vissza (HashPMap).

Térjünk át az egyéb adatszerkezetekre.

4. Lista felépítése (TreePVector és ConsPStack)

TreePVector a java.util.ArrayList míg ConsPStack az analógja java.util.LinkedList. TreePVector és ConsPStack kényelmes statikus módszerekkel rendelkezik az új példányok létrehozásához - akárcsak HashPMap.

A üres() módszer üreset hoz létre TreePVector, amíg a szingli() módszer létrehozza a TreePVector csak egy elemmel. Ott van még a tól től() metódus, amellyel létrehozhatunk egy példányt TreePVector bármelyiktől java.util.Gyűjtés.

ConsPStack azonos nevű statikus módszerekkel rendelkezik, amelyek ugyanazt a célt érik el.

TreePVector rendelkezik módszerekkel annak manipulálására. Megvan az mínusz() és minusAll () módszerek az elem (ek) eltávolítására; a plusz(), és plusAll () elem (ek) hozzáadásához.

A val vel() egy elemet egy megadott indexen helyettesít, és az subList () számos elemet kap a gyűjteményből.

Ezek a módszerek a ConsPStack is.

Vizsgáljuk meg a következő kódrészletet, amely a fent említett módszereket példázza:

TreePVector pVector = TreePVector.empty (); TreePVector pV1 = pVector.plus ("e1"); TreePVector pV2 = pV1.plusAll (Tömbök.asList ("e2", "e3", "e4")); assertEquals (1, pV1.size ()); assertEquals (4, pV2.size ()); TreePVector pV3 = pV2.minus ("e1"); TreePVector pV4 = pV3.minusAll (Tömbök.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");

A fenti kódrészletben pSub egy másik TreePVector objektum és független attól pV2. Amint megfigyelhető, pV2 nem változtatta meg a subList () művelet; inkább egy új TreePVector objektum létrehozva, és kitöltve a pV2 0-tól 2-ig.

Ezt kell érteni a változtathatatlanság alatt, és ez történik a PCollection összes módosító módszerével.

5. Állítsa be a struktúrát (MapPSet)

MapPSet állandó, térképalapú analógja java.util.HashSet. Statikus módszerekkel kényelmesen kiválasztható HashTreePSet - üres(), tól től() és szingli(). Ugyanúgy működnek, mint az előző példákban kifejtették.

MapPSet van plusz(), plusAll (), mínusz() és minusAll () módszerek a készletadatok manipulálására. Ezenkívül a módszereket örökli java.util.Set, java.util.AbstractCollection és java.util.AbstractSet:

MapPSet pSet = HashTreePSet.empty () .plusAll (Tömbök.asList ("e1", "e2", "e3", "e4")); assertEquals (pSet.size (), 4); MapPSet pSet1 = pSet.minus ("e4"); assertFalse (pSet1.contains ("e4"));

Végül ott van még OrderedPSet - amely ugyanúgy fenntartja az elemek beszúrási sorrendjét java.util.LinkedHashSet.

6. Következtetés

Összegzésképpen elmondhatom, hogy ebben a gyors bemutatóban megvizsgáltuk a PCollections-ot - azokat a tartós adatstruktúrákat, amelyek analógak a Java-ban elérhető alapvető gyűjteményekkel. Természetesen a PCollections Javadoc nagyobb betekintést nyújt a könyvtár bonyodalmaiba.

És mint mindig, a teljes kód megtalálható a Github oldalon.