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 Collections.
Обратите также внимание, что 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 имеет оптимизированные для памяти списки, наборы, стеки, карты и пакеты для всех примитивных типов. Давайте перейдем к нескольким примерам.
Во-первых, давайте взглянем на список длинных
s:
@Test
public void whenListOfLongHasOneTwoThree_thenSumIsSix() {
MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L);
assertEquals(6, longList.sum());
}
5. внутренний
список
Точно так же мы можем создать неизменяемый список int
s:
@Test
public void whenListOfIntHasOneTwoThree_thenMaxIsThree() {
ImmutableIntList intList = IntLists.immutable.of(1, 2, 3);
assertEquals(3, intList.max());
}
6. Карты
В дополнение к методам интерфейса Map
, Eclipse 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));
}
7. От итерируемых
к примитивным коллекциям
Кроме того, Eclipse Collections работает с 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);
}
Далее мы можем создать примитивную карту из Iterable:
@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);
}
8. Потоки
на примитивах
Поскольку Java уже поставляется с примитивными потоками, 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);
}
9. Заключение
В заключение, в этом руководстве представлены примитивные коллекции из Eclipse Collections. Мы продемонстрировали причины его использования и представили, как легко мы можем добавить его в наши приложения.
Как всегда, код доступен на GitHub .