Автор оригинала: Rodrigo Graciano.
1. введение
В этом уроке мы поговорим о примитивных коллекциях в Java и о том, как коллекции Eclipse могут помочь.
2. Мотивация
Предположим, мы хотим создать простой список целых чисел:
ListmyList = 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() { Iterableiterable = Interval.oneTo(3); MutableIntSet intSet = IntSets.mutable.withAll(iterable); IntInterval intInterval = IntInterval.oneTo(3); assertEquals(intInterval.toSet(), intSet); }
Кроме того, мы можем создать примитивную карту из Итерируемый:
@Test public void whenCreateMapFromStream_thenValuesMustMatch() { Iterableintegers = 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 .