Úvod do zbierok Eclipse

1. Prehľad

Eclipse Collections je ďalší vylepšený rámec pre zbieranie súborov v jazyku Java.

Jednoducho povedané, poskytuje optimalizované implementácie, ako aj niektoré ďalšie dátové štruktúry a funkcie, ktoré sa v jadre Java nenachádzajú.

Knižnica poskytuje premenlivé aj nemenné implementácie všetkých dátových štruktúr.

2. Závislosť od Maven

Začnime pridaním nasledujúcej závislosti Maven do našej pom.xml:

Najnovšiu verziu knižnice nájdeme v centrálnom úložisku Maven.

3. Celkový obraz

3.1. Základné typy zbierok

Základné typy zbierok v zbierkach Eclipse sú:

  • ListIterable - usporiadaná kolekcia, ktorá udržuje poradie vloženia a umožňuje duplicitné prvky. Medzi rozhrania patria: MutableList, FixedSizeList a ImmutableList. Najčastejšie Implementáciou ListIterable je FastList, čo je podtrieda MutableList
  • Nastaviteľný - kolekcia, ktorá neumožňuje duplicitné prvky. Môže byť triedený alebo netriedený. Medzi rozhrania patria: SortedSetIterable a UnsortedSetIterable. Najčastejšie netriedené Nastaviteľný implementácia je UnifiedSet
  • Mapovateľné - zbierka párov kľúč / hodnota. Medzi rozhrania patria MutableMap, FixedSizeMap a ImmutableMap. Dve bežné implementácie sú UnifiedMap a MutableSortedMap. Zatiaľ čo UnifiedMap neudržiava žiadny poriadok, MutableSortedMap udržuje prirodzené poradie prvkov
  • BiMap - kolekcia párov kľúč / hodnota, ktoré je možné iterovať v obidvoch smeroch. BiMap rozširuje Mapovateľné rozhranie
  • Taška - neusporiadaná zbierka, ktorá umožňuje duplikáty. Medzi rozhrania patria MutableBag aFixedSizeBag. Najbežnejšia implementácia je HashBag
  • Stohovateľné - kolekcia, ktorá udržiava poradie „last-in, first-out“ a prechádza prvkami v opačnom poradí. Medzi rozhrania patria MutableStack a ImmutableStack
  • MultiMap - kolekcia párov kľúč / hodnota, ktorá umožňuje viac hodnôt pre každý kľúč

3.2. Primitívne zbierky

Rámec tiež poskytuje obrovský súbor primitívnych zbierok; ich implementácie sú pomenované podľa typu, ktorý majú. Pre každý typ existujú premenlivé, nemenné, synchronizované a nemodifikovateľné formy:

  • Primitívne Zoznamy
  • Primitívne Sady
  • Primitívne Stohy
  • Primitívne Tašky
  • Primitívne Mapy
  • IntInterval

Existuje obrovské množstvo primitívnych foriem máp pokrývajúcich všetky možné kombinácie primitívnych alebo objektových kľúčov a buď primitívnych alebo objektových hodnôt.

Krátka poznámka - an IntInterval je rozsah celých čísel, ktoré možno iterovať pomocou krokovej hodnoty.

4. Vytvorenie zbierky

Pridanie prvkov do súboru ArrayList alebo HashSet, vytvoríme inštanciu kolekcie volaním konštruktora no-arg a následným pridaním každého prvku.

Aj keď to stále môžeme robiť v zbierkach Eclipse, môžeme tiež vytvoriť inštanciu kolekcie a poskytnúť všetky počiatočné prvky súčasne v jednom riadku.

Pozrime sa, ako môžeme vytvoriť inštanciu a FastList:

MutableList list = FastList.newListWith ("Porsche", "Volkswagen", "Toyota", "Mercedes", "Toyota");

Podobne môžeme vytvoriť inštanciu a UnifiedSet a pridajte doň prvky odovzdaním prvkov do newSetWith () statická metóda:

Porovnanie sady = UnifiedSet.newSetWith ("Porsche", "Volkswagen", "Toyota", "Mercedes");

Tu je príklad, ako môžeme vytvoriť inštanciu a HashBag:

Taška MutableBag = HashBag.newBagWith („Porsche“, „Volkswagen“, „Toyota“, „Porsche“, „Mercedes“);

Vytváranie inštancií máp a pridávanie párov kľúčov a hodnôt k nim je podobné. Jediný rozdiel je v tom, že dvojice kľúčov a hodnôt odovzdáme newMapWith () metóda ako implementácia Pár rozhranie.

Vezmime UnifiedMap ako príklad:

Párový pár1 = Tuples.pair (1, "Jeden"); Dvojica pair2 = Tuples.pair (2, "Two"); Dvojica pair3 = Tuples.pair (3, "Three"); Mapa UnifiedMap = nová UnifiedMap (pair1, pair2, pair3);

Stále môžeme používať prístup Java Collections API:

Mapa UnifiedMap = nová UnifiedMap (); map.put (1, „jeden“); map.put (2, "dva"); map.put (3, „tri“);

Odkedy nemenné zbierky nemožno upravovať, nemajú implementácie metód, ktoré upravujú zbierky ako napr pridať () a odstrániť ().

Nemodifikovateľné zbierky nám však umožňujú volať tieto metódy, ale hodia znak UnsupportedOperationException ak to urobíme.

5. Vyberanie prvkov zo zbierok

Rovnako ako použitie štandardu Zoznamy, prvky zbierok Eclipse Zoznamy možno načítať podľa ich indexu:

list.get (0);

A hodnoty máp zbierok Eclipse je možné načítať pomocou ich kľúča:

map.get (0);

The getFirst () a getLast () na získanie prvého a posledného prvku zoznamu je možné použiť metódy. V prípade iných kolekcií vrátia prvý a posledný prvok, ktorý by vrátil iterátor.

map.getFirst (); map.getLast ();

Metódy max () a min () možno použiť na získanie maximálnych a minimálnych hodnôt zbierky na základe prirodzeného usporiadania.

map.max (); map.min ();

6. Iterácia zbierky

Kolekcie Eclipse poskytujú mnoho spôsobov opakovania zbierok. Pozrime sa, čo to je a ako fungujú v praxi.

6.1. Filtrovanie zbierok

Vzor výberu vráti novú kolekciu obsahujúcu prvky kolekcie, ktoré vyhovujú logickej podmienke. V zásade ide o operáciu filtrovania.

Tu je príklad:

@Test public void givenListwhenSelect_thenCorrect () {MutableList greaterThanThirty = list .select (Predicates.greaterThan (30)) .sortThis (); Assertions.assertThat (greaterThanThirty). Obsahuje Presne (31, 38, 41); }

To isté sa dá urobiť pomocou jednoduchého výrazu lambda:

návrat list.select (i -> i> 30) .sortThis ();

Vzor odmietnutia je opačný. Vráti kolekciu všetkých prvkov, ktoré nespĺňajú logické podmienky.

Pozrime sa na príklad:

@Test public void whenReject_thenCorrect () {MutableList notGreaterThanThirty = list .reject (Predicates.greaterThan (30)) .sortThis (); Assertions.assertThat (notGreaterThanThirty) .containsExactlyElementsOf (this.expectedList); }

Tu odmietneme všetky prvky, ktoré sú väčšie ako 30.

6.2. The zbierať () Metóda

The zbierať metóda vracia novú kolekciu, ktorej prvkami sú výsledky vrátené poskytnutým výrazom lambda - v podstate ide o kombináciu mapa () a zbierať () z Stream API.

Pozrime sa na to v akcii:

@Test public void whenCollect_thenCorrect () {Student student1 = new Student ("John", "Hopkins"); Študent student2 = nový Študent ("George", "Adams"); MutableList students = FastList .newListWith (student1, student2); MutableList lastNames = students .collect (Student :: getLastName); Assertions.assertThat (lastNames) .containsExactly ("Hopkins", "Adams"); }

Vytvorená kolekcia priezviská obsahuje priezviská, ktoré sú zozbierané z študentov zoznam.

Ale, čo ak je vrátená kolekcia kolekciou kolekcií a my nechceme zachovať vnorenú štruktúru?

Napríklad, ak má každý študent viac adries a potrebujeme kolekciu, ktorá obsahuje adresy ako Struny namiesto zbierky zbierok môžeme použiť flatCollect () metóda.

Tu je príklad:

@Test public void whenFlatCollect_thenCorrect () {MutableList addresses = students .flatCollect (Student :: getAddresses); Assertions.assertThat (addresses) .containsExactlyElementsOf (this.exectedAddresses); }

6.3. Detekcia prvkov

The zistiť metóda vyhľadá a vráti prvý prvok, ktorý spĺňa logickú podmienku.

Poďme na krátky príklad:

@ Test public void whenDetect_thenCorrect () {Integer result = list.detect (Predicates.greaterThan (30)); Assertions.assertThat (result) .isEqualTo (41); }

The anySatisfy metóda určuje, či niektorý prvok kolekcie spĺňa logickú podmienku.

Tu je príklad:

@Test public void whenAnySatisfiesCondition_thenCorrect () {boolean result = list.anySatisfy (Predicates.greaterThan (30)); assertTrue (výsledok); }

Podobne všetci spokojní metóda určuje, či všetky prvky kolekcie vyhovujú logickej podmienke.

Pozrime sa na krátky príklad:

@ Test public void whenAnySatisfiesCondition_thenCorrect () {boolean result = list.allSatisfy (Predicates.greaterThan (0)); assertTrue (výsledok); }

6.4. The oddiel () Metóda

The prepážka metóda alokuje každý prvok kolekcie do jednej z dvoch kolekcií v závislosti od toho, či element vyhovuje logickej podmienke alebo nie.

Pozrime sa na príklad:

@Test public void whenAnySatisfiesCondition_thenCorrect () {MutableList numbers = list; PartitionMutableList partitionedFolks = čísla .partition (i -> i> 30); MutableList greaterThanThirty = partitionedFolks .getSelected () .sortThis (); MutableList smallerThanThirty = partitionedFolks .getRejected () .sortThis (); Assertions.assertThat (smallerThanThirty). Obsahuje Presne (1, 5, 8, 17, 23); Assertions.assertThat (greaterThanThirty). Obsahuje Presne (31, 38, 41); }

6.5. Lenivá iterácia

Lazy iterácia je optimalizačný vzor, ​​v ktorom je vyvolaná metóda iterácie, ale jej skutočné vykonanie sa odloží, kým jej následnú metódu alebo jej návratové hodnoty nevyžaduje iná následná metóda.

@Test public void whenLazyIteration_thenCorrect () {Student student1 = new Student ("John", "Hopkins"); Študent student2 = nový Študent ("George", "Adams"); Študent student3 = nový Študent ("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")); }

Tu je lenivýŠtudenti objekt nenačíta prvky prvku študentov zoznam až do zbierať () metóda sa volá.

7. Párovanie prvkov zberu

Metóda PSČ() vráti novú kolekciu kombináciou prvkov dvoch kolekcií do párov. Ak je ktorákoľvek z týchto dvoch kolekcií dlhšia, zostávajúce prvky budú skrátené.

Pozrime sa, ako to môžeme využiť:

@Test public void whenZip_thenCorrect () {MutableList numbers = Lists.mutable .with ("1", "2", "3", "Ignored"); MutableList cars = Lists.mutable .with ("Porsche", "Volvo", "Toyota"); MutableList dvojice = cisla.zip (auta); Assertions.assertThat (pair) .containsExactlyElementsOf (this.exectedPairs); }

Môžeme tiež spárovať prvky kolekcie s ich indexmi pomocou zipWithIndex () metóda:

@Test public void whenZip_thenCorrect () {MutableList cars = FastList .newListWith ("Porsche", "Volvo", "Toyota"); MutableList pair = cars.zipWithIndex (); Assertions.assertThat (pair) .containsExactlyElementsOf (this.exectedPairs); }

8. Prevod zbierok

Kolekcie Eclipse poskytujú jednoduché metódy na konverziu typu kontajnera na iný. Tieto metódy sú listovať(), nastaviť(), toBag () a mapovať().

Pozrime sa, ako ich môžeme použiť:

public static List convertToList () {UnifiedSet cars = new UnifiedSet (); cars.add ("Toyota"); cars.add ("Mercedes"); cars.add ("Volkswagen"); return cars.toList (); }

Spustíme náš test:

@Test public void whenConvertContainerToAnother_thenCorrect () {MutableList cars = (MutableList) ConvertContainerToAnother .convertToList (); Assertions.assertThat (cars) .containsExactlyElementsOf (FastList.newListWith ("Volkswagen", "Toyota", "Mercedes")); }

9. Záver

V tomto tutoriáli sme videli rýchly prehľad zbierok Eclipse a funkcií, ktoré poskytujú.

Plná implementácia tohto tutoriálu je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found