Eclipse Collections - это самая лучшая библиотека коллекций для Java,
доставляющая много удовольствия разработчикам программ.
Добавьте её к коду вашего проекта, используя систему
сборки предпочитаемую вами!
<dependency> <groupId>org.eclipse.collections</groupId> <artifactId>eclipse-collections-api</artifactId> <version>11.1.0</version> </dependency> <dependency> <groupId>org.eclipse.collections</groupId> <artifactId>eclipse-collections</artifactId> <version>11.1.0</version> </dependency>
implementation 'org.eclipse.collections:eclipse-collections-api:11.1.0' implementation 'org.eclipse.collections:eclipse-collections:11.1.0'
<dependency org="org.eclipse.collections" name="eclipse-collections-api" rev="11.1.0" /> <dependency org="org.eclipse.collections" name="eclipse-collections" rev="11.1.0" />
Получите максимум эффективности от лямбда-выражений и ссылок на методы в 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());
Неизменяемые (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.
@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 имеет свои корни в фреймворке 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.