Primitive Sammlungen in Eclipse-Sammlungen

1. Einleitung

In diesem Tutorial werden wir über primitive Sammlungen in Java sprechen und wie Eclipse-Sammlungen helfen können.

2. Motivation

Angenommen, wir möchten eine einfache Liste von Ganzzahlen erstellen:

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

Da Sammlungen nur Objektreferenzen halten können, hinter den Kulissen, die man auf einen umgewandelt Integer in dem Prozess. Das Boxen und Unboxen ist natürlich nicht kostenlos. Infolgedessen tritt bei diesem Prozess ein Leistungsverlust auf.

Die Verwendung primitiver Sammlungen aus Eclipse-Sammlungen kann uns also einen Geschwindigkeitsschub geben.

Zweitens wird der Speicherbedarf verringert. Die folgende Grafik vergleicht die Speichernutzung zwischen der herkömmlichen ArrayList und IntArrayList aus Eclipse-Sammlungen:

* Bild extrahiert aus //www.eclipse.org/collections/#concept

Und natürlich dürfen wir nicht vergessen, dass die Vielfalt der Implementierungen ein Verkaufsschlager für Eclipse Collections ist.

Beachten Sie auch, dass Java bis zu diesem Punkt keine Unterstützung für primitive Sammlungen bietet. Das Projekt Valhalla durch JEP 218 zielt jedoch darauf ab, es hinzuzufügen.

3. Abhängigkeiten

Wir werden Maven verwenden, um die erforderlichen Abhängigkeiten einzuschließen:

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

4. lange Liste

Eclipse Collections verfügt über speicheroptimierte Listen, Sets, Stapel, Karten und Taschen für alle primitiven Typen. Lassen Sie uns in einige Beispiele springen.

Schauen wir uns zunächst eine Liste mit langen s an:

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

5. int Liste

Ebenso können wir eine unveränderliche Liste von int s erstellen :

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

6. Karten

Zusätzlich zu den Map- Schnittstellenmethoden präsentieren Eclipse-Sammlungen für jede primitive Paarung neue:

@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. Von iterierbaren zu primitiven Sammlungen

Außerdem funktioniert Eclipse Collections mit 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); }

Außerdem können wir aus Iterable eine primitive Karte erstellen:

@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. Streams auf Primitiven

Da Java bereits mit primitiven Streams geliefert wird und sich Eclipse Collections gut in diese integriert:

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

Abschließend wurden in diesem Tutorial primitive Sammlungen aus Eclipse-Sammlungen vorgestellt. Wir haben Gründe für die Verwendung aufgezeigt und dargelegt, wie einfach wir es unseren Anwendungen hinzufügen können.

Wie immer ist der Code auf GitHub verfügbar.