Uvod u kolekcije Eclipse
1. Pregled
Eclipse Collections je još jedan poboljšani okvir za prikupljanje Java.
Jednostavno rečeno, pruža optimizirane implementacije, kao i neke dodatne podatkovne strukture i značajke koje se ne nalaze u jezgri Java.
Biblioteka nudi i promjenjive i nepromjenjive implementacije svih struktura podataka.
2. Ovisnost Mavena
Počnimo s dodavanjem sljedeće ovisnosti o Mavenu u našu pom.xml:
Najnoviju verziju knjižnice možemo pronaći u središnjem spremištu Maven.
3. Velika slika
3.1. Osnovne vrste zbirki
Osnovne vrste zbirki u kolekcijama Eclipse su:
- ListIterable - uređena zbirka koja održava redoslijed umetanja i omogućuje duplicirane elemente. Podsučelja uključuju: Promjenjiva lista, FixedSizeList i Nepromjenjiva lista. Najčešći Implementacija ListIterable je FastList, koja je podrazred MutableList
- Postavljivo - zbirka koja ne dopušta duplicirane elemente. Može se sortirati ili sortirati. Podsučelja uključuju: SortedSetIterable i UnsortedSetIterable. Najčešći sortirani Postavljivo provedba je UnifiedSet
- MapIterable - zbirka parova ključ / vrijednost. Podsučelja uključuju Promjenjiva karta, FixedSizeMap i Nepromjenjiva karta. Dvije su uobičajene implementacije UnifiedMap i MutableSortedMap. Dok UnifiedMap ne održava nikakav red, MutableSortedMap održava prirodni poredak elemenata
- BiMap - zbirka parova ključ / vrijednost kroz koje se može ponoviti u bilo kojem smjeru. BiMap proširuje MapIterable sučelje
- Torba - neuređena zbirka koja dopušta duplikate. Podsučelja uključuju MutableBag iFixedSizeBag. Najčešća provedba je HashBag
- StackIterable - zbirka koja održava redoslijed "posljednji ulazak, prvi izlazak", koji se ponavlja kroz elemente obrnutim redoslijedom umetanja. Podsučelja uključuju MutableStack i ImmutableStack
- MultiMap - zbirka parova ključ / vrijednost koja omogućuje više vrijednosti za svaki ključ
3.2. Primitivne zbirke
Okvir također pruža ogroman skup primitivnih kolekcija; njihove su implementacije nazvane prema vrsti koju drže. Postoje promjenjivi, nepromjenjivi, sinkronizirani i nepromjenjivi oblici za svaku vrstu njih:
- Primitivno Popisi
- Primitivno Kompleti
- Primitivno Stogovi
- Primitivno Torbe
- Primitivno Karte
- IntInterval
Postoji ogroman broj primitivnih oblika mapa koji pokrivaju sve moguće kombinacije bilo primitivnih ili objektnih ključeva, bilo primitivnih ili objektnih vrijednosti.
Kratka napomena - an IntInterval je raspon cijelih brojeva koji se mogu ponoviti pomoću vrijednosti koraka.
4. Instanciranje kolekcije
Da biste dodali elemente u ArrayList ili HashSet, instanciramo kolekciju pozivanjem konstruktora no-arg i dodavanjem svakog elementa jedan po jedan.
Iako to još uvijek možemo učiniti u kolekcijama Eclipse, također možemo instancirati zbirku i pružiti sve početne elemente istovremeno u jednom retku.
Pogledajmo kako možemo napraviti instancu a FastList:
Lista promjenjivih popisa = FastList.newListWith ("Porsche", "Volkswagen", "Toyota", "Mercedes", "Toyota");
Slično tome, možemo instancirati a UnifiedSet i dodajte joj elemente prosljeđivanjem elemenata u newSetWith () statička metoda:
Postavi usporedbu = UnifiedSet.newSetWith ("Porsche", "Volkswagen", "Toyota", "Mercedes");
Evo kako možemo napraviti instancu a HashBag:
Torba MutableBag = HashBag.newBagWith ("Porsche", "Volkswagen", "Toyota", "Porsche", "Mercedes");
Instanciranje karata i dodavanje parova ključeva i vrijednosti na njih je slično. Jedina je razlika što parove ključeva i vrijednosti prosljeđujemo u newMapWith () metoda kao implementacija Par sučelje.
Idemo uzeti UnifiedMap kao primjer:
Par para1 = Tuples.pair (1, "One"); Par para2 = Tuples.pair (2, "Two"); Par para3 = Tuples.pair (3, "Three"); Karta UnifiedMap = nova UnifiedMap (par1, par2, par3);
I dalje možemo koristiti pristup API-ja Java Collections:
Karta UnifiedMap = nova UnifiedMap (); map.put (1, "jedan"); map.put (2, "dva"); map.put (3, "tri");
Od nepromjenjive kolekcije ne mogu se mijenjati, nemaju implementacije metoda koje modificiraju zbirke kao što su dodati() i ukloniti().
Neizmjenjive kolekcije, međutim, omogućuju nam pozivanje ovih metoda, ali će baciti znak UnsupportedOperationException ako to učinimo.
5. Dohvaćanje elemenata iz kolekcija
Baš kao i korištenje standardnih Popisi, elementi kolekcija Eclipse Popisi mogu se dohvatiti njihovim indeksom:
list.get (0);
A vrijednosti mapa Eclipse Collections mogu se dobiti pomoću njihovog ključa:
map.get (0);
The getFirst () i getLast () metode se mogu koristiti za dohvaćanje prvog i posljednjeg elementa popisa. U slučaju ostalih zbirki, vraćaju prvi i zadnji element koji bi iterator vratio.
map.getFirst (); map.getLast ();
Metode maks. () i min () može se koristiti za dobivanje maksimalnih i minimalnih vrijednosti zbirke na temelju prirodnog redoslijeda.
map.max (); map.min ();
6. Iteriranje nad zbirkom
Eclipse Collections nudi mnogo načina za ponavljanje zbirki. Pogledajmo što su i kako rade u praksi.
6.1. Filtriranje zbirke
Uzorak odabira vraća novu kolekciju koja sadrži elemente kolekcije koji zadovoljavaju logički uvjet. To je u osnovi postupak filtriranja.
Evo primjera:
@Test javna praznina givenListwhenSelect_thenCorrect () {MutableList largerThanThirty = list .select (Predicates.greaterThan (30)) .sortThis (); Tvrdnje.assertThat (većeThanThirty) .conlectEase (31, 38, 41); }
Ista stvar može se učiniti pomoću jednostavnog lambda izraza:
vratiti popis.select (i -> i> 30) .sortThis ();
Obrazac odbijanja je suprotan. Vraća zbirku svih elemenata koji ne zadovoljavaju logički uvjet.
Pogledajmo primjer:
@Test public void whenReject_thenCorrect () {MutableList notGreaterThanThirty = list .reject (Predicates.greaterThan (30)) .sortThis (); Assertions.assertThat (notGreaterThanThirty) .containsExactlyElementsOf (this.expectedList); }
Ovdje odbacujemo sve elemente koji su veći od 30.
6.2. The prikupiti() Metoda
The prikupiti metoda vraća novu kolekciju čiji su elementi rezultati koje daje dani lambda izraz - u osnovi je to kombinacija karta() i prikupiti() iz Stream API-ja.
Pogledajmo na djelu:
@Test public void whenCollect_thenCorrect () {Student student1 = novi student ("John", "Hopkins"); Student student2 = novi Student ("George", "Adams"); Promjenjivi popis učenika = FastList .newListWith (student1, student2); Promjenjivi popis lastNames = students .collect (Student :: getLastName); Assertions.assertThat (lastNames) .containsExactly ("Hopkins", "Adams"); }
Stvorena kolekcija prezimena sadrži prezimena prikupljena iz studenti popis.
Ali, što ako je vraćena zbirka zbirka zbirki i ne želimo održavati ugniježđenu strukturu?
Na primjer, ako svaki učenik ima više adresa, a trebamo zbirku koja sadrži adrese kao Žice umjesto zbirke zbirki, možemo koristiti flatCollect () metoda.
Evo primjera:
@Test public void whenFlatCollect_thenCorrect () {Adrese MutableList = students .flatCollect (Student :: getAddresses); Assertions.assertThat (adrese) .containsExactlyElementsOf (this.expectedAddresses); }
6.3. Otkrivanje elemenata
The otkriti metoda pronalazi i vraća prvi element koji zadovoljava logički uvjet.
Krenimo na brzi primjer:
@Test public void whenDetect_thenCorrect () {Integer result = list.detect (Predicates.greaterThan (30)); Tvrdnje.assertThat (rezultat) .isEqualTo (41); }
The bilo zadovolji metoda određuje zadovoljava li bilo koji element zbirke logički uvjet.
Evo primjera:
@Test public void whenAnySatisfiesCondition_thenCorrect () {boolean result = list.anySatisfy (Predicates.greaterThan (30)); assertTrue (rezultat); }
Slično tome, sveZadovoljiti metoda određuje zadovoljavaju li svi elementi zbirke logički uvjet.
Pogledajmo brzi primjer:
@Test public void whenAnySatisfiesCondition_thenCorrect () {boolean result = list.allSatisfy (Predicates.greaterThan (0)); assertTrue (rezultat); }
6.4. The particija () Metoda
The pregrada metoda dodjeljuje svaki element zbirke u jednu od dvije zbirke, ovisno o tome zadovoljava li element logički uvjet.
Pogledajmo primjer:
@Test public void whenAnySatisfiesCondition_thenCorrect () {MutableList numbers = list; PartitionMutableList partitionedFolks = brojevi .partition (i -> i> 30); Promjenjiva lista većiThanThirty = partitionedFolks .getSelected () .sortThis (); Promjenjiv popis manjiThanThirty = partitionedFolks .getRejected () .sortThis (); Tvrdnje.assertThat (smallThanThirty) .conlectEase (1, 5, 8, 17, 23); Tvrdnje.assertThat (većeThanThirty) .conlectEase (31, 38, 41); }
6.5. Lijena ponavljanja
Lijena iteracija je optimizacijski obrazac u kojem se poziva metoda iteracije, ali se njezino stvarno izvršavanje odgađa dok druga naknadna metoda ne zahtijeva njezinu akciju ili povratne vrijednosti.
@Test public void whenLazyIteration_thenCorrect () {Student student1 = novi student ("John", "Hopkins"); Student student2 = novi Student ("George", "Adams"); Student student3 = novi student ("Jennifer", "Rodriguez"); MutableList students = Lists.mutable .with (student1, student2, student3); LazyIterable lazyStudents = students.asLazy (); LazyIterable lastNames = lazyStudents .collect (Student :: getLastName); Assertions.assertThat (lastNames) .containsAll (Lists.mutable.with ("Hopkins", "Adams", "Rodriguez")); }
Evo, lijeniStudenti objekt ne dohvaća elemente studenti popis do prikupiti() metoda se naziva.
7. Uparivanje elemenata kolekcije
Metoda ZIP () vraća novu kolekciju kombiniranjem elemenata dviju kolekcija u parove. Ako je bilo koja od dvije zbirke duža, preostali će elementi biti skraćeni.
Pogledajmo kako ga možemo koristiti:
@Test public void whenZip_thenCorrect () {MutableList numbers = Lists.mutable .with ("1", "2", "3", "Ignored"); Promjenjiva lista automobila = Lists.mutable .with ("Porsche", "Volvo", "Toyota"); Promjenjiva lista parovi = brojevi.zip (automobili); Assertions.assertThat (parovi) .containsExactlyElementsOf (this.expectedPairs); }
Elemente kolekcije također možemo upariti s njihovim indeksima pomoću zipWithIndex () metoda:
@Test public void whenZip_thenCorrect () {MutableList cars = FastList .newListWith ("Porsche", "Volvo", "Toyota"); Promjenjiva lista parovi = automobili.zipWithIndex (); Assertions.assertThat (parovi) .containsExactlyElementsOf (this.expectedPairs); }
8. Pretvaranje zbirki
Eclipse Collections nudi jednostavne metode za pretvaranje vrste spremnika u drugu. Ove metode su izlistati(), postaviti(), toBag () i toMap ().
Pogledajmo kako ih možemo koristiti:
javni statični popis convertToList () {UnifiedSet automobili = novi UnifiedSet (); automobili.add ("Toyota"); automobili.add ("Mercedes"); automobili.add ("Volkswagen"); vratiti automobile.toList (); }
Pokrenimo naš test:
@Test public void whenConvertContainerToAnother_thenCorrect () {MutableList cars = (MutableList) ConvertContainerToAnother .convertToList (); Assertions.assertThat (automobili) .containExactlyElementsOf (FastList.newListWith ("Volkswagen", "Toyota", "Mercedes")); }
9. Zaključak
U ovom uputstvu vidjeli smo brzi pregled kolekcija Eclipse i značajki koje pružaju.
Potpuna implementacija ovog vodiča dostupna je na GitHubu.