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.