Primitívne zbierky v zbierkach Eclipse

1. Úvod

V tomto výučbe si povieme o primitívnych zbierkach v Jave a o tom, ako môžu zbierky Eclipse pomôcť.

2. Motivácia

Predpokladajme, že chceme vytvoriť jednoduchý zoznam celých čísel:

Zoznam myList = nový ArrayList; int jedna = 1; myList.add (jeden);

Keďže zbierky môžu obsahovať iba odkazy na objekty, v zákulisí jeden sa prevádza na Celé číslo v procese. Box a unboxing samozrejme nie sú zadarmo. Výsledkom je pokles výkonu v tomto procese.

Po prvé, použitie primitívnych kolekcií z kolekcie Eclipse Collection nám môže zvýšiť rýchlosť.

Po druhé, znižuje to pamäťovú stopu. Nasledujúci graf porovnáva využitie pamäte medzi tradičnými ArrayList a IntArrayList zo zbierok Eclipse:

* Obrázok extrahovaný z //www.eclipse.org/collections/#concept

A samozrejme, nezabúdajme, že rozmanitosť implementácií je pre Eclipse Collections veľkým predajcom.

Upozorňujeme tiež, že Java až do tohto bodu nepodporuje primitívne zbierky. Avšak Projekt Valhalla prostredníctvom JEP 218 má za cieľ ho pridať.

3. Závislosti

Použijeme Maven na zahrnutie požadovaných závislostí:

 org.eclipse.collections zatmenie-zbierky-api 10.0.0 org.eclipse.collections zatmenie-zbierky 10.0.0 

4. dlho Zoznam

Kolekcie Eclipse majú pamäťovo optimalizované zoznamy, súpravy, zásobníky, mapy a tašky pre všetky primitívne typy. Poďme na pár príkladov.

Najprv sa pozrime na zoznam dlhos:

@Test public void whenListOfLongHasOneTwoThree_thenSumIsSix () {MutableLongList longList = LongLists.mutable.of (1L, 2L, 3L); assertEquals (6, longList.sum ()); }

5. int Zoznam

Rovnako môžeme vytvoriť nemenný zoznam ints:

@Test public void whenListOfIntHasOneTwoThree_thenMaxIsThree () {ImmutableIntList intList = IntLists.immutable.of (1, 2, 3); assertEquals (3, intList.max ()); }

6. Mapy

Navyše k Mapa Metódy rozhrania, zbierky Eclipse predstavujú nové pre každé primitívne párovanie:

@Test public void testOperationsOnIntIntMap () {mapa MutableIntIntMap = nový IntIntHashMap (); assertEquals (5, map.addToValue (0, 5)); assertEquals (5, map.get (0)); assertEquals (3, map.getIfAbsentPut (1, 3)); }

7. Od Iterable do primitívnych zbierok

S kolekciami Eclipse tiež spolupracujete Iterable:

@Test public void whenConvertFromIterableToPrimitive_thenValuesAreEqual () {Iterable iterable = Interval.oneTo (3); MutableIntSet intSet = IntSets.mutable.withAll (iterovateľné); IntInterval intInterval = IntInterval.oneTo (3); assertEquals (intInterval.toSet (), intSet); }

Ďalej môžeme vytvoriť primitívnu mapu z Iterovateľné:

@Test public void whenCreateMapFromStream_thenValuesMustMatch () {Iterable integers = Interval.oneTo (3); MutableIntIntMap map = IntIntMaps.mutable.from (celé čísla, kľúč -> kľúč, hodnota -> hodnota * hodnota); MutableIntIntMap expect = IntIntMaps.mutable.empty () .withKeyValue (1, 1) .withKeyValue (2, 4) .withKeyValue (3, 9); assertEquals (očakávané, mapa); }

8. Prúdy o primitivoch

Pretože Java už prichádza s primitívnymi prúdmi a zbierky Eclipse sa s nimi pekne integrujú:

@Test public void whenCreateDoubleStream_thenAverageIsThree () {DoubleStream doubleStream = DoubleLists .mutable.with (1.0, 2.0, 3.0, 4.0, 5.0) .primitiveStream (); assertEquals (3, doubleStream.average (). getAsDouble (), 0,001); }

9. Záver

Na záver tento tutoriál predstavil primitívne zbierky z kolekcie Eclipse. Ukázali sme dôvody, prečo ho využívať, a predstavili sme, ako ľahko ho môžeme pridať do našich aplikácií.

Ako vždy je kód k dispozícii na GitHub.