Отрицать это или нет, структуры данных важны. Выбор правильного значительно повысит производительность вашей программы / продукта / приложения. Это может даже дать вам отличную работу.

Многие (основные) языки программирования поставляются с библиотекой коллекций. Это предоставляет 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. rejectselect только те, которые возвращают 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`.

Если вам понравилась эта статья, пожалуйста, оставьте лайк или комментарий. :сердце:

Если вы чувствуете, что в статье что-то не так / не хватает, не стесняйтесь комментировать :)

Вы можете следить за мной в Твиттере.