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.