«1. Введение

В этом руководстве мы поговорим о примитивных коллекциях в Java и о том, как коллекции Eclipse могут помочь.

2. Мотивация

Предположим, мы хотим создать простой список целых чисел:

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

Так как коллекции могут содержать только ссылки на объекты, за кулисами один преобразуется в целое число в процессе. Бокс и распаковка, конечно, не бесплатны. В результате в этом процессе происходит потеря производительности.

Итак, во-первых, использование примитивных коллекций из Eclipse Collections может дать нам прирост скорости.

Во-вторых, это уменьшает объем памяти. На приведенном ниже графике сравнивается использование памяти между традиционным ArrayList и IntArrayList из коллекций Eclipse:

*Изображение взято с https://www.eclipse.org/collections/#concept

реализаций является большим продавцом для коллекций Eclipse.

Обратите внимание, что до этого момента в Java не было поддержки примитивных коллекций. Однако Project Valhalla через JEP 218 стремится добавить его.

3. Зависимости

Мы будем использовать Maven для включения необходимых зависимостей:

<dependency>
    <groupId>org.eclipse.collections</groupId>
    <artifactId>eclipse-collections-api</artifactId>
    <version>10.0.0</version>
</dependency>

<dependency>
    <groupId>org.eclipse.collections</groupId>
    <artifactId>eclipse-collections</artifactId>
    <version>10.0.0</version>
</dependency>

4. длинный список

Eclipse Collections имеет оптимизированные для памяти списки, наборы, стеки, карты и пакеты для все примитивные типы. Давайте перейдем к нескольким примерам.

Во-первых, давайте посмотрим на список длинных чисел:

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

5. Список целых чисел

Точно так же мы можем создать неизменяемый список целых чисел:

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

6. Карты ~~ ~ В дополнение к методам интерфейса Map, Eclipse Collections предоставляет новые методы для каждой пары примитивов:

7. От Iterable к Primitive Collections

@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));
}

Кроме того, Eclipse Collections работает с Iterable:

Далее , мы можем создать примитивную карту из Iterable:

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

8. Потоки на примитивах

@Test
public void whenCreateMapFromStream_thenValuesMustMatch() {
    Iterable<Integer> 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);
}

Так как Java уже поставляется с примитивными потоками, и Eclipse Collections хорошо с ними интегрируется:

9. Заключение ~ ~~ В заключение, в этом уроке представлены примитивные коллекции из Eclipse Collections. Мы продемонстрировали причины его использования и представили, как легко мы можем добавить его в наши приложения.

@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);
}

Как всегда, код доступен на GitHub.

«

As always the code is available over on GitHub.