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