Introduksjon til formørkelssamlinger

1. Oversikt

Eclipse Collections er et annet forbedret samlingsrammeverk for Java.

Enkelt sagt, det gir optimaliserte implementeringer, samt noen ekstra datastrukturer og funksjoner som ikke finnes i kjernen Java.

Biblioteket gir både foranderlige og uforanderlige implementeringer av alle datastrukturer.

2. Maven avhengighet

La oss starte med å legge til følgende Maven-avhengighet til vår pom.xml:

Vi finner den nyeste versjonen av biblioteket i Maven Central Repository.

3. Det store bildet

3.1. Grunnleggende samlingstyper

Grunnleggende samlingstyper i formørkelsamlinger er:

  • ListIterable - en bestilt samling som opprettholder innsettingsordre og tillater dupliserte elementer. Undergrensesnitt inkluderer: MutableList, FixedSizeList og ImmutableList. Den vanligste ListIterable implementering er FastList, som er en underklasse av MutableList
  • SetIterable - en samling som ikke tillater dupliserte elementer. Det kan sorteres eller usorteres. Undergrensesnitt inkluderer: SortedSetIterable og UnsortedSetIterable. Den vanligste usorterte SetIterable implementering er UnifiedSet
  • KartIterabelt - en samling nøkkel / verdipar. Undergrensesnitt inkluderer MutableMap, FixedSizeMap og ImmutableMap. To vanlige implementeringer er UnifiedMap og MutableSortedMap. Samtidig som UnifiedMap opprettholder ingen ordre, MutableSortedMap opprettholder den naturlige rekkefølgen av elementene
  • BiMap - en samling nøkkel- / verdipar som kan gjentas i begge retninger. BiMap utvider KartIterabelt grensesnitt
  • Bag - en uordnet samling som tillater duplikater. Undergrensesnitt inkluderer MutableBag ogFixedSizeBag. Den vanligste implementeringen er HashBag
  • StackIterable - en samling som opprettholder "siste inn, først ut" rekkefølge, iterere gjennom elementer i omvendt innsettingsrekkefølge. Undergrensesnitt inkluderer MutableStack og ImmutableStack
  • MultiMap - en samling nøkkel- / verdipar som tillater flere verdier for hver nøkkel

3.2. Primitive samlinger

Rammeverket gir også et stort sett med primitive samlinger; deres implementeringer er oppkalt etter typen de har. Det er foranderlige, uforanderlige, synkroniserte og umodifiserbare former for hver type av dem:

  • Primitiv Lister
  • Primitiv Settene
  • Primitiv Stabler
  • Primitiv Vesker
  • Primitiv Kart
  • IntInterval

Det er et stort antall primitive kartformer som dekker alle mulige kombinasjoner av enten primitive eller objektnøkler og enten primitive eller objektverdier.

Et raskt notat - en IntInterval er et utvalg av heltall som kan gjentas ved å bruke en trinnverdi.

4. Instansere en samling

For å legge til elementer i en ArrayList eller HashSet, instanserer vi en samling ved å ringe konstruktøren no-arg og deretter legge til hvert element en etter en.

Mens vi fremdeles kan gjøre det i formørkelssamlinger, vi kan også sette i gang en samling og gi alle innledende elementer samtidig i en enkelt linje.

La oss se hvordan vi kan instantiere en FastList:

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

På samme måte kan vi instantiere en UnifiedSet og legg til elementer i det ved å sende elementene til newSetWith () statisk metode:

Sett sammenligning = UnifiedSet.newSetWith ("Porsche", "Volkswagen", "Toyota", "Mercedes");

Slik kan vi sette i gang en HashBag:

MutableBag bag = HashBag.newBagWith ("Porsche", "Volkswagen", "Toyota", "Porsche", "Mercedes");

Instantiering av kart og legging av nøkkel- og verdipar til dem er lik. Den eneste forskjellen er at vi sender nøkkel- og verdiparene til newMapWith () metoden som implementeringer av Par grensesnitt.

La oss ta UnifiedMap som et eksempel:

Par par1 = Tuples.pair (1, "One"); Par par2 = Tuples.pair (2, "To"); Par par3 = Tuples.pair (3, "Tre"); UnifiedMap-kart = nytt UnifiedMap (par1, par2, par3);

Vi kan fortsatt bruke tilnærmingen til Java Collections API:

UnifiedMap-kart = nytt UnifiedMap (); map.put (1, "one"); map.put (2, "to"); map.put (3, "tre");

Siden uforanderlige samlinger kan ikke endres, de har ikke implementeringer av metoder som endrer samlinger som for eksempel legge til() og fjerne().

Umodifiserbare samlinger tillater oss imidlertid å kalle disse metodene, men vil kaste et Ikke-støttetOperationException hvis vi gjør det.

5. Henter elementer fra samlinger

Akkurat som å bruke standard Lister, elementer fra Eclipse Collections Lister kan hentes av indeksen deres:

list.get (0);

Og verdiene til Eclipse Collections-kart kan hentes ved hjelp av nøkkelen:

map.get (0);

De getFirst () og getLast () metoder kan brukes til å hente henholdsvis første og siste element i en liste. Når det gjelder andre samlinger, returnerer de det første og det siste elementet som ville bli returnert av en iterator.

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

Metodene maks () og min () kan brukes til å få maksimums- og minimumsverdiene til en samling basert på den naturlige bestillingen.

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

6. Iterere over en samling

Formørkelsessamlinger gir mange måter å gjenta over samlinger. La oss se hva de er og hvordan de fungerer i praksis.

6.1. Samlingsfiltrering

Valgmønsteret returnerer en ny samling som inneholder elementer i en samling som tilfredsstiller en logisk tilstand. Det er egentlig en filtreringsoperasjon.

Her er et eksempel:

@Test offentlig ugyldig givenListwhenSelect_thenCorrect () {MutableList greaterThanThirty = liste .select (Predicates.greaterThan (30)) .sortThis (); Påstander.assertThat (greaterThanThirty). Inneholder nøyaktig (31, 38, 41); }

Det samme kan gjøres ved hjelp av et enkelt lambdauttrykk:

returliste. velg (i -> i> 30). sortThis ();

Avvisningsmønsteret er det motsatte. Den returnerer en samling av alle elementene som ikke tilfredsstiller en logisk tilstand.

La oss se et eksempel:

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

Her avviser vi alle elementer som er større enn 30.

6.2. De samle inn() Metode

De samle inn metoden returnerer en ny samling der elementene er resultatene som returneres av det angitte lambdauttrykket - egentlig er det en kombinasjon av kart() og samle inn() fra Stream API.

La oss se det i aksjon:

@Test offentlig ugyldig nårCollect_thenCorrect () {Student student1 = ny Student ("John", "Hopkins"); Studentstudent2 = ny student ("George", "Adams"); MutableList studenter = FastList .newListWith (student1, student2); MutableList lastNames = students .collect (Student :: getLastName); Assertions.assertThat (lastNames) .containsExactly ("Hopkins", "Adams"); }

Den opprettet samlingen etternavn inneholder etternavnene som er hentet fra studenter liste.

Men, hva om den returnerte samlingen er en samling av samlinger og vi ikke ønsker å opprettholde en nestet struktur?

For eksempel hvis hver elev har flere adresser, og vi trenger en samling som inneholder adressene som Strenger i stedet for en samling samlinger, kan vi bruke flatkolleksjon () metode.

Her er et eksempel:

@Test offentlig ugyldig nårFlatCollect_thenCorrect () {MutableList-adresser = studenter .flatCollect (Student :: getAddresses); Assertions.assertThat (adresser) .containsExactlyElementsOf (this.expectedAddresses); }

6.3. Elementdeteksjon

De oppdage metoden finner og returnerer det første elementet som tilfredsstiller en logisk tilstand.

La oss gå over et raskt eksempel:

@Test offentlig ugyldig nårDetect_thenCorrect () {Heltallresultat = list.detect (Predicates.greaterThan (30)); Assertions.assertThat (result) .isEqualTo (41); }

De noen tilfredsstille metoden avgjør om noe element i en samling tilfredsstiller en logisk tilstand.

Her er et eksempel:

@Test offentlig ugyldig nårAnySatisfiesCondition_thenCorrect () {boolean result = list.anySatisfy (Predicates.greaterThan (30)); assertTrue (resultat); }

Tilsvarende allSatisfy metoden avgjør om alle elementene i en samling tilfredsstiller en logisk tilstand.

La oss se et raskt eksempel:

@Test offentlig ugyldig nårAnySatisfiesCondition_thenCorrect () {boolean result = list.allSatisfy (Predicates.greaterThan (0)); assertTrue (resultat); }

6.4. De skillevegg() Metode

De skillevegg metoden tildeler hvert element i en samling i en av to samlinger, avhengig av om elementet tilfredsstiller en logisk tilstand eller ikke.

La oss se et eksempel:

@Test offentlig ugyldig nårAnySatisfiesCondition_thenCorrect () {MutableList numbers = list; PartitionMutableList partitionedFolks = tall .partition (i -> i> 30); MutableList greaterThanThirty = partitionedFolks .getSelected () .sortThis (); MutableList smallerThanThirty = partitionedFolks .getRejected () .sortThis (); Påstander.assertThat (smallerThanThirty). Inneholder nøyaktig (1, 5, 8, 17, 23); Påstander.assertThat (greaterThanThirty). Inneholder nøyaktig (31, 38, 41); }

6.5. Laz Iteration

Lat iterasjon er et optimaliseringsmønster der en iterasjonsmetode påberopes, men den faktiske kjøringen utsettes til dens handling eller returverdier kreves av en annen påfølgende metode.

@Test offentlig ugyldig nårLazyIteration_thenCorrect () {Student student1 = ny Student ("John", "Hopkins"); Studentstudent2 = ny student ("George", "Adams"); Studentstudent3 = ny student ("Jennifer", "Rodriguez"); MutableList studenter = 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")); }

Her, den lazyStudents objektet henter ikke elementene i studenter listen til samle inn() metoden kalles.

7. Paring av samleelementer

Metoden glidelås() returnerer en ny samling ved å kombinere elementer i to samlinger i par. Hvis noen av de to samlingene er lengre, blir de gjenværende elementene avkortet.

La oss se hvordan vi kan bruke det:

@Test offentlig ugyldig nårZip_thenCorrect () {MutableList numbers = Lists.mutable .with ("1", "2", "3", "Ignored"); MutableList biler = Lists.mutable .with ("Porsche", "Volvo", "Toyota"); MutableList par = numbers.zip (biler); Assertions.assertThat (pair) .containsExactlyElementsOf (this.expectedPairs); }

Vi kan også koble elementene til en samling med indeksene deres ved hjelp av zipWithIndex () metode:

@Test offentlig annullert nårZip_thenCorrect () {MutableList biler = FastList .newListWith ("Porsche", "Volvo", "Toyota"); MutableList par = biler.zipWithIndex (); Assertions.assertThat (pair) .containsExactlyElementsOf (this.expectedPairs); }

8. Konvertering av samlinger

Eclipse Collections gir enkle metoder for å konvertere en containertype til en annen. Disse metodene er å liste opp(), å sette(), toBag () og å kartlegge().

La oss se hvordan vi kan bruke dem:

offentlig statisk liste convertToList () {UnifiedSet biler = nye UnifiedSet (); cars.add ("Toyota"); cars.add ("Mercedes"); cars.add ("Volkswagen"); returnere biler.tilListe (); }

La oss kjøre testen vår:

@Test offentlig ugyldig nårConvertContainerToAnother_thenCorrect () {MutableList cars = (MutableList) ConvertContainerToAnother .convertToList (); Assertions.assertThat (biler) .containsExactlyElementsOf (FastList.newListWith ("Volkswagen", "Toyota", "Mercedes")); }

9. Konklusjon

I denne veiledningen har vi sett en rask oversikt over Eclipse Collections og funksjonene de gir.

Den fulle implementeringen av denne opplæringen er tilgjengelig på GitHub.


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