«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.