Eclipse Collections - Функции, которые вы хотите, в коллекциях, которые вам нужны.

# Eclipse Collections

### - Функции, которые вы хотите, в коллекциях, которые вам нужны -

## Что такое
Eclipse Collections

Eclipse Collections - это самая лучшая библиотека коллекций для Java, доставляющая много удовольствия разработчикам программ.
Добавьте её к коду вашего проекта, используя систему сборки предпочитаемую вами!

    <dependency>
      <groupId>org.eclipse.collections</groupId>
      <artifactId>eclipse-collections-api</artifactId>
      <version>11.0.0</version>
    </dependency>

    <dependency>
      <groupId>org.eclipse.collections</groupId>
      <artifactId>eclipse-collections</artifactId>
      <version>11.0.0</version>
    </dependency>

    implementation 'org.eclipse.collections:eclipse-collections-api:11.0.0'
    implementation 'org.eclipse.collections:eclipse-collections:11.0.0'

    <dependency org="org.eclipse.collections" name="eclipse-collections-api" rev="11.0.0" />
    <dependency org="org.eclipse.collections" name="eclipse-collections" rev="11.0.0" />

    eclipse-collections-api-11.0.0.jar
    eclipse-collections-11.0.0.jar

## Богатые, выразительные и легко читаемые интерфейсы (API)

Получите максимум эффективности от лямбда-выражений и ссылок на методы в Java 8, используя богатые интерфейсы, которые доступны прямо на ваших коллекциях.

    boolean anyPeopleHaveCats =
      this.people
        .anySatisfyWith(Person::hasPet, PetType.CAT);

    int countPeopleWithCats =
      this.people
        .countWith(Person::hasPet, PetType.CAT);

    MutableList<Person> peopleWithCats =
      this.people
        .selectWith(Person::hasPet, PetType.CAT)

    boolean anyPeopleHaveCats =
      this.people
        .anySatisfy(person -> person.hasPet(PetType.CAT));

    int countPeopleWithCats =
      this.people
        .count(person -> person.hasPet(PetType.CAT));

    MutableList<Person> peopleWithCats =
      this.people
        .select(person -> person.hasPet(PetType.CAT));

    boolean anyPeopleHaveCats =
      this.people
        .stream()
        .anyMatch(person -> person.hasPet(PetType.CAT));

    long countPeopleWithCats =
      this.people
        .stream()
        .filter(person -> person.hasPet(PetType.CAT))
        .count();

    List<Person> peopleWithCats =
      this.people
        .stream()
        .filter(person -> person.hasPet(PetType.CAT))
        .collect(Collectors.toList());

## Большое разнообразие структур данных, включая
неизменяемые коллекции, коллекции примитивных типов, Bimap, Multimap и Bag

Неизменяемые (immutable) коллекции, коллекции примитивных типов, Bimap ("инвертированный" словарь, можно найти ключ по значению), Multimap (мультисловари, словари с не уникальными ключами) и Bag (мультимножество, множество с повторяющимся элементами) - вы можете создать все эти разнообразные типы контейнеров, используя удобные и легко находимые фабрики.

    // Инициализируем изменяемый список при помощи методов with empty(), of(), with()
    MutableList<String> mutableListEmpty =
      Lists.mutable.empty();
    MutableList<String> mutableListOf =
      Lists.mutable.of("One", "One", "Two", "Three");
    MutableList<String> mutableListWith =
      Lists.mutable.with("One", "One", "Two", "Three");

    // Разнообразные типы контейнеров
    MutableSet<String> mutableSet =
      Sets.mutable.with("One", "One", "Two", "Three");
    MutableBag<String> mutableBag =
      Bags.mutable.with("One", "One", "Two", "Three");
    MutableStack<String> mutableStack =
      Stacks.mutable.with("One", "One", "Two", "Three");
    MutableMap<String, String> mutableMap =
      Maps.mutable.with("key1", "value1", "key2", "value2", "key3", "value3");
    MutableMultimap<String, String> multimapWithList =
      Multimaps.mutable.list.with("key1", "value1-1", "key1", "value1-2", "key2","value2-1");
    MutableBiMap<String, String> mutableBiMap =
      BiMaps.mutable.with("key1", "value1", "key2", "value2", "key3", "value3");

    // Инициализируем неизменяемые списки при помощи методов with empty(), of(), with()
    ImmutableList<String> immutableListEmpty =
      Lists.immutable.empty();
    ImmutableList<String> immutableListOf =
      Lists.immutable.of("One", "One", "Two", "Three");
    ImmutableList<String> immutableListWith =
      Lists.immutable.with("One", "One", "Two", "Three");

    // Разнообразные типы контейнеров
    ImmutableSet<String> immutableSet =
      Sets.immutable.with("One", "One", "Two", "Three");
    ImmutableBag<String> immutableBag =
      Bags.immutable.with("One", "One", "Two", "Three");
    ImmutableStack<String> immutableStack =
      Stacks.immutable.with("One", "One", "Two", "Three");
    ImmutableMap<String, String> immutableMap =
      Maps.immutable.with("key1", "value1", "key2", "value2", "key3", "value3");
    ImmutableMultimap<String, String> immutableMultimapWithList =
      Multimaps.immutable.list.with("key1", "value1-1", "key1", "value1-2", "key2","value2-1");
    ImmutableBiMap<String, String> immutableBiMap =
      BiMaps.immutable.with("key1", "value1", "key2", "value2", "key3", "value3");

    //Изменяемые и неизменяемые контейнеры List, Set, Bag, Stack и Map существуют для всех примитивных типов
    MutableIntList intList =
      IntLists.mutable.of(1, 2, 3);
    MutableLongList longList =
      LongLists.mutable.of(1L, 2L, 3L);
    MutableCharList charList =
      CharLists.mutable.of('a', 'b', 'c');
    MutableShortList shortList =
      ShortLists.mutable.of((short)1, (short)2, (short)3);
    MutableByteList byteList =
      ByteLists.mutable.of((byte)1, (byte)2, (byte)3);
    MutableBooleanList booleanList =
      BooleanLists.mutable.of(true, false);
    MutableFloatList floatList =
      FloatLists.mutable.of(1.0f, 2.0f, 3.0f);
    MutableDoubleList doubleList =
      DoubleLists.mutable.of(1.0, 2.0, 3.0);

    //Вы можете создать диапазон типа int с помошью IntInterval
    IntInterval oneTo10 =
      IntInterval.fromTo(1, 10); // ints from 1 to 10
    // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    IntInterval oneTo10By3 =
      IntInterval.fromToBy(1, 10, 3); // ints from 1 to 10 step by 3
    // [1, 4, 7, 10]
    IntInterval oddsFrom1To10 =
      IntInterval.oddsFromTo(1, 10); // odd ints from 1 to 10
    // [1, 3, 5, 7, 9]
    IntInterval evensFrom1To10 =
      IntInterval.evensFromTo(1, 10); // even ints from i to 10
    // [2, 4, 6, 8, 10]

## Уменьшите расход памяти
при помощи коллекций с эффективным использованием памяти

Eclipse Collections содержит оптимизированные по памяти реализации интерфейсов Set (множества) и Maps (словари), а также коллекции примитивных типов.

## Выучите Eclipse Collections с помощью ката

Ознакомьтесь с Eclipse Collections Ката - это лёгкий и интересный способ выучить, как писать правильный, идиоматический код с Eclipse Collections. Эта ката состоит из последовательности тестов, которые изначально не проходят. Ваша задача - сделать так, чтобы тесты проходили, используя Eclipse Collections.

    @Test
    public void getFirstNamesOfAllPeople()
    {
      MutableList<Person> people = this.people;
      MutableList<String> firstNames = null; //Replace null, with a transformation method on MutableList.
      MutableList<String> expectedFirstNames =
        Lists.mutable.with("Mary", "Bob", "Ted", "Jake", "Barry", "Terry", "Harry", "John");
      Assert.assertEquals(expectedFirstNames, firstNames);
    }

    @Test
    public void getFirstNamesOfAllPeople()
    {
      MutableList<Person> people = this.people;
      MutableList<String> firstNames = people.collect(Person::getFirstName);
      MutableList<String> expectedFirstNames =
        Lists.mutable.with("Mary", "Bob", "Ted", "Jake", "Barry", "Terry", "Harry", "John");
      Assert.assertEquals(expectedFirstNames, firstNames);
    }

## История Eclipse Collections

Eclipse Collections имеет свои корни в фреймворке Caramel, созданном в компании Goldman Sachs в 2004 году. С тех пор фреймворк развивался, и в 2012 году его исходный код был открыт на GitHub как проект под названием GS Collections.
О GS Collections было рассказано на множестве конференций, включая JVM Language Summit в 2012 году и JavaOne в 2014 году. Сравнение производительности параллельных ленивых реализаций коллекций в Java 8, Scala и GS Collections было представлено в QCon New York в 2014 году. Статьи о GS Collections (Часть 1 / Часть 2) были опубликованы на сайте InfoQ.com, демонстрируя возможности фреймворка на моногчисленных примерах. Они также включали и интервью с создателем GS Collections.
За эти годы около 40 разработчиков внесли исправления и дополнения в этот фреймворк, но все эти разработчики были из одной компании (Goldman Sachs).
Чтобы полностью реализовать потенциал открытого проекта, фреймворк GS Collections перешёл в Eclipse Foundation, и был соответственно переименован в Eclipse Collections в 2015 году. Теперь платформа Eclipse Collections доступна всем, и любой разработчик может принять участие в её развитии!

## Руководство

Полное руководство по библиотеке можно найти на GitHub здесь: Reference Guide (англ.)

## Исходный Код

Исходный код находится на GitHub: Eclipse Collections.

### Участие

Мы приветсвуем ваше участие!
Вы можете ознакомиться с планом равития Eclipse Collections здесь.
Мы принимаем предложения на изменение кода через запросы на слияние ("pull request") в GitHub. Чтобы сделать свой вклад в проект, пожалуйста ознакомьтесь с этим документом: How To Contribute (англ.)

### Новости проекта

Eclipse Collections 11.0.0 выпущен (Nov 23rd 2021)

Eclipse Collections 10.4.0 выпущен (Aug 20th 2020)

Eclipse Collections 10.3.0 выпущен (Aug 8th 2020)

Eclipse Collections 10.2.0 выпущен (Feb 11th 2020)

Eclipse Collections 10.1.0 выпущен (Dec 4th 2019)

Eclipse Collections 10.0.0 выпущен (Jul 10th 2019)

### Полезные ссылки

Eclipse PMI: управление проектом на сайте eclipse

GitHub: eclipse-collections

Трекер заявок: отслеживание заявок на GitHub

Список рассылки: collections-dev

Wiki: GitHub wiki

Форум: Eclipse Collections Forum

StackOverflow: с пометкой (тегом) eclipse-collections

### - Больше функций, меньше трат -