1. Gambaran keseluruhan
Dalam artikel ini, kita akan melihat PCollections, perpustakaan Java yang menyediakan koleksi tetap dan tidak berubah.
Struktur data berterusan (koleksi) tidak dapat diubah secara langsung semasa operasi kemas kini, sebaliknya objek baru dengan hasil operasi kemas kini dikembalikan. Mereka tidak hanya berubah tetapi juga berterusan - yang bermaksud bahawa setelah pengubahsuaian dilakukan, versi koleksi sebelumnya tidak berubah.
PCollections serupa dan sesuai dengan kerangka Java Collections.
2. Kebergantungan
Mari tambahkan kebergantungan berikut ke pom.xml kami untuk kami menggunakan PCollections dalam projek kami:
org.pcollections pcollections 2.1.2
Sekiranya projek kami berasaskan Gradle, kami dapat menambahkan artifak yang sama ke fail build.gradle kami :
compile 'org.pcollections:pcollections:2.1.2'
Versi terbaru boleh didapati di Maven Central.
3. Struktur Peta ( HashPMap )
HashPMap adalah struktur data peta yang berterusan. Ia adalah analog untuk java.util.HashMap yang digunakan untuk menyimpan data nilai kunci yang tidak kosong.
Kita dapat mewujudkan HashPMap dengan menggunakan kaedah statik yang mudah di HashTreePMap. Kaedah statik ini mengembalikan instance HashPMap yang disokong oleh IntTreePMap.
Statik kosong () kaedah yang HashTreePMap kelas mewujudkan kosong HashPMap yang tidak mempunyai elemen - seperti menggunakan pembina lalai java.util.HashMap :
HashPMap pmap = HashTreePMap.empty();
Terdapat dua kaedah statik lain yang dapat kita gunakan untuk membuat HashPMap . Kaedah singleton () membuat HashPMap dengan hanya satu entri:
HashPMap pmap1 = HashTreePMap.singleton("key1", "value1"); assertEquals(pmap1.size(), 1);
Kaedah dari () membuat HashPMap dari contoh java.util.HashMap yang ada (dan pelaksanaan java.util.Map lain ):
Map map = new HashMap(); map.put("mkey1", "mval1"); map.put("mkey2", "mval2"); HashPMap pmap2 = HashTreePMap.from(map); assertEquals(pmap2.size(), 2);
Walaupun HashPMap mewarisi beberapa kaedah dari java.util.AbstractMap dan java.util.Map , ia mempunyai kaedah yang unik untuknya.
Kaedah minus () membuang satu entri dari peta sementara kaedah minusAll () membuang beberapa entri. Terdapat juga kaedah tambah () dan plusAll () yang masing-masing menambah satu dan beberapa entri:
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);
Penting untuk diperhatikan bahawa panggilan meletakkan () pada pmap akan membuang UnsupportedOperationException. Oleh kerana objek PCollections tetap dan tidak berubah, setiap operasi pengubahsuaian mengembalikan contoh baru dari objek ( HashPMap ).
Mari teruskan untuk melihat struktur data lain.
4. Struktur Senarai ( TreePVector dan ConsPStack )
TreePVector adalah analog berterusan java.util.ArrayList sementara ConsPStack adalah analog java.util.LinkedList . TreePVector dan ConsPStack mempunyai kaedah statik yang mudah untuk membuat kejadian baru - seperti HashPMap .
Kaedah kosong () membuat TreePVector kosong , sementara kaedah singleton () membuat TreePVector dengan hanya satu elemen. Terdapat juga kaedah dari () yang dapat digunakan untuk membuat contoh TreePVector dari java.util.Collection mana pun .
ConsPStack mempunyai kaedah statik dengan nama yang sama yang mencapai matlamat yang sama.
TreePVector mempunyai kaedah untuk memanipulasinya. Ia mempunyai kaedah tolak () dan minusAll () untuk penyingkiran unsur; yang ditambah () , dan plusAll () untuk penambahan elemen (s).
Yang dengan () digunakan untuk menggantikan unsur pada indeks yang ditetapkan, dan subsenarai () mendapat pelbagai unsur-unsur dari koleksi.
Kaedah ini boleh didapati di ConsPStack juga.
Mari pertimbangkan coretan kod berikut yang menunjukkan kaedah yang disebutkan di atas:
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");
Dalam coretan kod di atas, pSub adalah objek TreePVector yang lain dan tidak bergantung kepada pV2 . Seperti yang dapat diperhatikan, pV2 tidak diubah oleh operasi subList () ; sebaliknya objek TreePVector baru dibuat dan diisi dengan elemen pV2 dari indeks 0 hingga 2.
Inilah yang dimaksudkan dengan kebolehubahan dan inilah yang berlaku dengan semua kaedah pengubahsuaian PCollections.
5. Tetapkan Struktur ( MapPSet )
MapPSet ialah berterusan, peta-disokong, analog java.util.HashSet . Ia boleh dibuktikan dengan kaedah statik HashTreePSet - kosong () , dari () dan singleton () . Mereka berfungsi dengan cara yang sama seperti yang dijelaskan dalam contoh sebelumnya.
MapPSet mempunyai kaedah plus () , plusAll () , minus () dan minusAll () untuk memanipulasi data set. Selanjutnya, ia mewarisi kaedah dari java.util.Set , java.util.AbstractCollection dan java.util.Ab 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"));
Akhirnya, terdapat juga OrderedPSet - yang mengekalkan susunan elemen yang dimasukkan seperti java.util.LinkedHashSet .
6. Kesimpulannya
Kesimpulannya, dalam tutorial ringkas ini, kami meneroka PCollections - struktur data berterusan yang serupa dengan koleksi teras yang kami ada di Java. Sudah tentu, PCollections Javadoc memberikan lebih banyak gambaran mengenai selok-belok perpustakaan.
Dan, seperti biasa, kod lengkap boleh didapati di Github.