Collezioni primitive nelle collezioni Eclipse

1. Introduzione

In questo tutorial, parleremo delle raccolte primitive in Java e di come le collezioni Eclipse possono essere d'aiuto.

2. Motivazione

Supponiamo di voler creare un semplice elenco di numeri interi:

List myList = new ArrayList; int one = 1; myList.add(one);

Poiché le raccolte possono contenere solo riferimenti a oggetti, dietro le quinte, quello viene convertito in un numero intero nel processo. Il pugilato e l'unboxing non sono gratuiti, ovviamente. Di conseguenza, c'è una perdita di prestazioni in questo processo.

Quindi, in primo luogo, l'utilizzo di raccolte primitive di Eclipse Collections può darci un aumento di velocità.

In secondo luogo, riduce l'impronta di memoria. Il grafico seguente confronta l'utilizzo della memoria tra il tradizionale ArrayList e IntArrayList da Eclipse Collections:

* Immagine estratta da //www.eclipse.org/collections/#concept

E, naturalmente, non dimentichiamo, la varietà di implementazioni è un grande venditore per le collezioni Eclipse.

Nota anche che Java fino a questo punto non ha il supporto per le raccolte primitive. Tuttavia, il progetto Valhalla attraverso JEP 218 mira ad aggiungerlo.

3. Dipendenze

Useremo Maven per includere le dipendenze richieste:

 org.eclipse.collections eclipse-collections-api 10.0.0   org.eclipse.collections eclipse-collections 10.0.0 

4. lungo elenco

Eclipse Collections ha elenchi, set, stack, mappe e borse ottimizzati per la memoria per tutti i tipi primitivi. Facciamo un salto in alcuni esempi.

Per prima cosa, diamo un'occhiata a un elenco di messaggi lunghi :

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

5. int List

Allo stesso modo, possiamo creare un elenco immutabile di int s:

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

6. Mappe

Oltre ai metodi dell'interfaccia Map , le collezioni Eclipse ne presentano di nuovi per ogni accoppiamento primitivo:

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

7. Dalle collezioni iterabili a quelle primitive

Inoltre, le collezioni Eclipse funzionano con Iterable :

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

Inoltre, possiamo creare una mappa primitiva da Iterable:

@Test public void whenCreateMapFromStream_thenValuesMustMatch() { Iterable integers = Interval.oneTo(3); MutableIntIntMap map = IntIntMaps.mutable.from( integers, key -> key, value -> value * value); MutableIntIntMap expected = IntIntMaps.mutable.empty() .withKeyValue(1, 1) .withKeyValue(2, 4) .withKeyValue(3, 9); assertEquals(expected, map); }

8. Flussi sulle primitive

Poiché Java viene già fornito con flussi primitivi e le collezioni Eclipse si integrano perfettamente con loro:

@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. Conclusione

In conclusione, questo tutorial ha presentato le raccolte primitive dalle collezioni Eclipse. Abbiamo dimostrato i motivi per utilizzarlo e abbiamo presentato la facilità con cui possiamo aggiungerlo alle nostre applicazioni.

Come sempre il codice è disponibile su GitHub.