Рубрики
Без рубрики

Примитивные коллекции в коллекциях Eclipse

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

Автор оригинала: Rodrigo Graciano.

1. введение

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

2. Мотивация

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

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

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

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

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

*Изображение, извлеченное из https://www.eclipse.org/collections/#concept

И, конечно, давайте не будем забывать, что разнообразие реализаций является большим продавцом для коллекций Eclipse.

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

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

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


    org.eclipse.collections
    eclipse-collections-api
    10.0.0



    org.eclipse.collections
    eclipse-collections
    10.0.0

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

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

Во-первых, давайте взглянем на список long s:

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

5. список int

Аналогично, мы можем создать неизменяемый список int s:

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

6. Карты

В дополнение к методам интерфейса Map коллекции Eclipse представляют новые для каждого примитивного сопряжения:

@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. От итеративных к примитивным коллекциям

Кроме того, коллекции Eclipse работают с 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);
}

Кроме того, мы можем создать примитивную карту из Итерируемый:

@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. Потоки на примитивах

Поскольку Java уже поставляется с примитивными потоками, и коллекции Eclipse прекрасно интегрируются с ними:

@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. Заключение

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

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