Визуальный обзор API, интерфейсов, фабрик, статических утилит и адаптеров в Коллекциях Eclipse с использованием интеллектуальных карт.

Одна картинка стоит тысячи слов

Я не уверен, сколько слов стоит интеллект-карта, но они полезны для фрагментов информации. Eclipse Collections - очень многофункциональная библиотека. Ментальные карты помогают организовать и сгруппировать концепции, а также помогают передать ощущение симметрии в коллекциях Eclipse.

Симметричная симпатия

RichIterable API

RichIterable API - это набор общих API, разделяемых всеми классами контейнеров в Eclipse Collections. Некоторые методы имеют перегруженные формы, которые принимают дополнительные параметры. На картинке ниже я сгруппировал уникальный набор методов по функциональности, которую они предоставляют.

API на примере

Ниже приведены ссылки на несколько блогов, посвященных различным API, доступным на RichIterable.

  1. Фильтрация (Разбиение на разделы)
  2. Преобразование (Собрать / FlatCollect)
  3. Короткое замыкание
  4. Подсчет
  5. Фильтр / Карта / Уменьшить
  6. Eclipse Collections API по сравнению с Stream API

RichIterable Интерфейс Hiearchy

RichIterable - это базовый тип для большинства типов контейнеров в коллекциях Eclipse. Даже объектные Map типы расширяют RichIterable в Eclipse Collections. Map типа K (ключ) и V (значение) будет расширением RichIterable из V (значение). Это обеспечивает богатый набор поведения Map типов для их значений. Вы по-прежнему можете перебирать ключи, ключи и значения вместе, и для этой цели существуют отдельные методы.

Иерархия интерфейса PrimitiveIterable

Eclipse Collections обеспечивает поддержку контейнеров для всех восьми примитивов Java. Существует базовый интерфейс с общим поведением под названием PrimitiveIterable.

На следующей диаграмме показана ветвь IntIterable из диаграммы выше. Есть еще семь подобных веток.

Иерархия интерфейса для каждого примитивного типа почти такая же, как и IntIterable.

Заводы

Если вы хотите создать коллекцию в Eclipse Collections, у вас есть несколько доступных вариантов. Один из вариантов - использовать конструктор или статический фабричный метод для конкретного изменяемого типа, который вы хотите создать. Для этого вам необходимо знать имена конкретных изменяемых типов (например, FastList, UnifiedSet или UnifiedMap). Однако эта опция не существует для неизменяемых типов. Самый удобный, последовательный и симметричный вариант, если вы собираетесь создавать как изменяемые, так и неизменяемые контейнеры, - это использовать один из предоставленных фабричных классов. Класс фабрики следует шаблону использования имени типа и буквы s, чтобы сделать его множественным числом. Поэтому, если вам нужен изменяемый или неизменяемый List, вы должны использовать класс Lists, а затем указать, хотите ли вы изменяемую или неизменяемую фабрику для этого класса.

Для примитивных контейнеров существуют отдельные фабричные классы. Префикс примитивного типа перед типом контейнера, чтобы найти правильный примитивный фабричный класс.

Примеры изменчивой фабрики

MutableList<T> list = Lists.mutable.empty();
MutableSet<T> set = Sets.mutable.empty();
MutableSortedSet<T> sortedSet = SortedSets.mutable.empty();
MutableMap<K, V> map = Maps.mutable.empty();
MutableSortedMap<K, V> sortedMap = SortedMaps.mutable.empty();
MutableStack<T> stack = Stacks.mutable.empty();
MutableBag<T> bag = Bags.mutable.empty();
MutableSortedBag<T> sortedBag = SortedBags.mutable.empty();
MutableBiMap<K, V> biMap = BiMaps.mutable.empty();

Неизменяемые фабричные примеры

ImmutableList<T> list = Lists.immutable.empty();
ImmutableSet<T> set = Sets.immutable.empty();
ImmutableSortedSet<T> sortedSet = SortedSets.immutable.empty();
ImmutableMap<K, V> map = Maps.immutable.empty();
ImmutableSortedMap<K, V> sortedMap = SortedMaps.immutable.empty();
ImmutableStack<T> stack = Stacks.immutable.empty();
ImmutableBag<T> bag = Bags.immutable.empty();
ImmutableSortedBag<T> sortedBag = SortedBags.immutable.empty();
ImmutableBiMap<K, V> biMap = BiMaps.immutable.empty();

Статические служебные классы

В начале разработки коллекций Eclipse все выполнялось с помощью статических служебных классов. Позже мы добавили наши собственные типы интерфейсов. Со временем в Eclipse Collections накопилось довольно много статических служебных классов, которые служат различным целям. Статические служебные классы полезны, когда вы хотите использовать API Eclipse Collections с типами, расширяющими интерфейсы JDK Collection, такими как Iterable, Collection, List, RandomAccess и Map.

Примеры статических утилит

Assert.assertTrue(
        Iterate.anySatisfy(
                Collections.singleton("1"),
                "1"::equals));
Assert.assertTrue(
        ListIterate.anySatisfy(
                Collections.singletonList("1"),
                Predicates.equal("1")));
Assert.assertTrue(
        MapIterate.anySatisfy(
                Collections.singletonMap(1, "1"),
                Predicates.notEqual("2")));
String[] strings = {"1", "2", "3"};
Assert.assertTrue(
        ArrayIterate.anySatisfy(strings, "1"::equals));
Assert.assertTrue(
        ArrayIterate.contains(strings, "1"));

Адаптеры

Существуют адаптеры, которые предоставляют API-интерфейсы коллекций Eclipse для типов JDK.

Создание адаптера

MutableList<String> list = 
        Lists.adapt(new ArrayList<>());
MutableSet<String> set = 
        Sets.adapt(new HashSet<>());
MutableMap<String, String> map = 
        Maps.adapt(new HashMap<>());
MutableList<String> array = 
        ArrayAdapter.adapt("1", "2", "3");
CharAdapter chars = 
        Strings.asChars("Hello Chars!");
CodePointAdapter codePoints = 
        Strings.asCodePoints("Hello CodePoints!");
LazyIterable<String> lazy = 
        LazyIterate.adapt(new CopyOnWriteArrayList<>());

Дополнительные типы

В коллекциях Eclipse есть и другие типы, например Multimaps. Об этом будет рассказано в отдельном блоге. Multimap - это один из сегодняшних типов, наряду с ParallelIterable, который не распространяется RichIterable напрямую.

Ссылки

  1. Справочное руководство по коллекциям Eclipse
  2. Коллекции Eclipse Katas
  3. API-дизайн коллекций Eclipse
  4. Рефакторинг для коллекций Eclipse
  5. Объяснение UnifiedMap, UnifiedSet и Bag

Коллекции Eclipse открыты для взносов. Если вам нравится библиотека, вы можете сообщить нам об этом, отметив ее на GitHub.