Отрицать это или нет, структуры данных важны. Выбор правильного значительно повысит производительность вашей программы / продукта / приложения. Это может даже дать вам отличную работу.
Многие (основные) языки программирования поставляются с библиотекой коллекций. Это предоставляет API-интерфейсы и реализации, упрощающие работу для конечных пользователей. Эти реализации быстрые и созданы, чтобы упростить работу конечным пользователям.
Предоставление слишком большого количества опций увеличивает кривую изучения языка, а предоставление меньшего количества вариантов приводит к громоздкой реализации пользователями. Таким образом, языки должны быть очень осторожны в том, что они предоставляют. Java обеспечивает идеальный баланс.
Коллекции Eclipse обеспечивают оптимальные и эффективные реализации коллекций на Java.
Коллекции Eclipse добавили несколько дополнительных структур данных, которые изначально не доступны в ядре Java.
Но наиболее важно то, что Eclipse-Collections предоставляет элегантные, функциональные и плавные API, с которыми вы можете работать.
Основные причины, по которым я люблю коллекции eclipse:
- API потрясающие. Это
Functional
,Lazy
,Parallel
иEager
(пока оптимизированы) - предоставляет коллекции
immutable
иmutable
- обеспечивает высокооптимизированную и эффективную с точки зрения памяти реализацию
Настроить
Если вы используете проект Maven, включите зависимости коллекции eclipse, как показано ниже:
<dependency <groupId>org.eclipse.collections</groupId> <artifactId>eclipse-collections</artifactId> <version>10.0.0</version> </dependency>
Если вы используете Gradle, импортируйте его:
compile 'org.eclipse.collections:eclipse-collections-api:10.0.0' compile 'org.eclipse.collections:eclipse-collections:10.0.0'
Ингредиенты
Коллекции Eclipse состоят из следующих структур данных:
- Список
- Установленный
- карта
- BiMap
- MultiMap
- Сумка
- Куча
- Пара и другие
Все эти структуры данных включают следующие реализации:
- Мутабельный
- Неизменный
- Ленивый
- Параллельный
- Заказал
- Отсортировано
- Фиксированный
- Примитивный и другие
Обратите внимание на не все реализации для всех коллекций.
Код, Код, Код…
Доступно несколько отличных кодовых кат. Они здесь".
Начнем с List
. Чтобы создать новый изменяемый список, мы можем сделать следующее:
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Вы можете создать список с помощью of
.
MutableList<Integer> firstTenNumbers = Lists.mutable.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Подумав, почему есть реализация of
и with
- посмотрите этот пост в блоге.
Воспроизведение
Мы можем извлекать элементы классическим get(index)
способом. Коллекции Eclipse предоставляют методы getFirst()
и getLast()
для получения первого и последнего элементов соответственно.
firstTenNumbers.get(4); // 4 firstTenNumbers.getFirst(); // 0 firstTenNumbers.getLast(); // 9
В функциональной парадигме take
| takeWhile
| drop
| dropWhile
API-интерфейсы являются явными и упрощают создание функций. Они берут и удаляют определенные элементы из списка, не изменяя их. С коллекциями Eclipse мы можем сделать это в `Java`.
брось и возьми
Каждая из функций drop
и take
принимает неотрицательное целое число n
. drop
возвращает все элементы после данного индекса, а take
возвращает все элементы до данного индекса.
firstTenNumbers.take(3); // 0, 1, 2 firstTenNumbers.drop(3); // 3, 4, 5, 6, 7, 8, 9
Функции drop
и take
могут быть указаны с помощью следующей функции:
list.take(n) + list.drop(n) == list
dropWhile и takeWhile
Технически это drop
и take
, но вместо числа в качестве аргумента они принимают predicate
функцию.
Функция takeWhile
вернет все значения, пока предикат не вернет истину.
firstTenNumbers.takeWhile(i -> i % 2 == 0); // 0
Функция dropWhile
вернет все значения в списке, после чего предикат вернет истину.
firstTenNumbers.dropWhile(i -> i % 2 == 0); // 1, 2, 3, 4, 5, 6, 7, 8, 9
Конвертеры
Часто нам нужно converters
. Роль преобразователей состоит в том, чтобы изменять список из одной формы в другую. То есть с Mutable
на Immutable
или наоборот.
Мы можем добиться этого с помощью toMutable (используя toList, toMap, toSet, toBag) и toImmutable
соответственно.
MutableList<T> iCanChange = Lists.mutable.with(T… args); iCanChange.toImmutable(); // From now onwards I cannot Change ImmutableList<T> iCannotChange = Lists.immutable.with(T… args); iCannotChange.toMutable(); // From now on I can change
Нам нужно будет перевернуть наш список, и API предоставляет нам toReversed
функцию для достижения того же.
MutableList<T> normalList = Lists.mutable.with(T… args); normalList.toReversed();
Структура данных стека встроена в библиотеку. Мы можем преобразовать list
в stack
, используя toStack()
.
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); firstTenNumbers.toStack().pop(4); // 9, 8, 7, 6
Доступно множество других конвертеров, например
toSet
,toSortedSet
,toMap
,toBiMap
и другие.
Почтовый индекс
Функция zip
возьмет pair of lists
и преобразует их в list of pairs
. То есть:
// [T], [U] => [T, U] MutableList<Integer> houseNumbers = Lists.mutable.with(123, 456, 789); MutableList<String> owners = Lists.mutable.with(“Ram”, “Raj”, “Rahul”); owners.zip(houseNumbers); // (Ram:123), (Raj:456), (Rahul:789)
Также важно отметить, что длина списков не обязательно должна быть одинаковой.
Функция zip
имеет множество применений, например, получение скалярного произведения.
Выбрать и отклонить
select
и reject
не что иное, как filters
. Оба они примут предикат. select
выбирают только те true
. reject
select только те, которые возвращают false
.
MutableList<Integer> evenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) .select(i -> i % 2 == 0); // 0, 2, 4, 6, 8 MutableList<Integer> oddNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) .reject(i -> i % 2 == 0); // 1, 3, 5, 7, 9
Обратите внимание, что вы также можете использовать rejectWith и selectWith с функцией предиката.
Раздел
PartitionMutableCollection - это результат разделения изменяемой коллекции на две изменяемые коллекции на основе предиката. - Коллекции Eclipse
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); System.out.println(firstTenNumbers.partition(i -> i % 2 == 0).getSelected()); // 0, 2, 4, 6, 8
partition
принимает предикат и разбивает список на основе предиката.
Обратите внимание, что вы также можете использовать partitionWith.
Группа по
Иногда нам нужно сгруппировать элементы вместе, мы можем использовать для этого groupBy
. groupBy
примет функцию предиката и сгруппирует элемент на основе возвращаемого значения предиката.
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); System.out.println(firstTenNumbers.groupBy(i -> i % 2 == 0 ? “even” : “odd”)); // {even=[0, 2, 4, 6, 8], odd=[1, 3, 5, 7, 9]}
Собирать
collect
более или менее аналогичен map
. Требуется функция. Затем применяет функцию ко всем значениям списка и возвращает новый список с обновленными значениями.
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); System.out.println(firstTenNumbers.collect(i -> i + 1)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Мы даже можем сделать
flatCollect
.
Отчетливый
`Distinct`, как следует из названия, собирает distinct
значений в массиве.
MutableList<Integer> distinctValueList = Lists.mutable.with(1, 1, 2, 3, 4).distinct(); // [1, 2, 3, 4]
AnySatisfy, AllSatisfy и NoneSatisfy
any|all|noneSatisfy
упрощает проверку и лениво оценивает. Например
MutableList<Character> gradeList = Lists.mutable.with(‘A’, ‘A’, ‘F’, ‘B’); Boolean isPass = gradeList.allSatisfy(c -> c != ‘F’); // False Boolean isFail = gradeList.anySatisfy(c -> c == ‘F’); // True Boolean isPass = gradeList.noneSatisfy(c -> c == ‘F’); // False
Макс, Мин и Сумма
Как следует из названия, они получают максимальное, минимальное и sumOfInt значений в предоставленном списке.
MutableList<Integer> firstTenNumbers = Lists.mutable.with(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); System.out.println(firstTenNumbers.min()); // 0 System.out.println(firstTenNumbers.max()); // 9 System.out.println(firstTenNumbers.sumOfInt(i -> i)); // 45
Доступно множество других API, посмотрите полный список [здесь] (https://www.eclipse.org/collections/javadoc/10.0.0/overview-summary.html).
Мы продолжим с еще более подробным руководством по `Eclipse Collections`.
Если вам понравилась эта статья, пожалуйста, оставьте лайк или комментарий. :сердце:
Если вы чувствуете, что в статье что-то не так / не хватает, не стесняйтесь комментировать :)
Вы можете следить за мной в Твиттере.