Рубрики
Без рубрики

Как фильтровать коллекцию на Java

Быстрый учебник по фильтрации коллекций на Java с использованием различных подходов.

Автор оригинала: Ger Roza.

1. Обзор

В этом коротком учебнике Мы посмотрим на различные способы фильтрации коллекции в Java- – то есть найти все предметы, которые отвечают определенному условию.

Это фундаментальная задача, которая присутствует практически в любом Java-приложении.

По этой причине количество библиотек, которые обеспечивают функциональность для этой цели, является значительным.

В частности, в этом учебнике мы будем охватывать:

  • Java 8 Потоки ‘ фильтр () функция
  • Java 9 фильтрация коллектор
  • Соответствующие Коллекции затмения пчела
  • Апач в Фильтр CollectionUtils () метод
  • Гуава Коллекции2 фильтр () подход

2. Использование потоков

С момента введения Java 8 Streams в большинстве случаев играли ключевую роль в обработке сбора данных.

Следовательно, это предпочтительный подход в большинстве случаев, поскольку он построен в Java и не требует дополнительных зависимостей.

2.1. Фильтрация коллекции с помощью потоков

Ради простоты, во всех примерах нашей целью будет создание метода, который получает только ные цифры из Коллекционая Интегер Значения.

Таким образом, мы можем выразить условие, которое мы будем использовать для оценки каждого элемента, как ” значение % 2 ‘.

Во всех случаях, мы должны определить это условие как Предикат объект:

public Collection findEvenNumbers(Collection baseCollection) {
    Predicate streamsPredicate = item -> item % 2 == 0;

    return baseCollection.stream()
      .filter(streamsPredicate)
      .collect(Collectors.toList());
}

Важно отметить, что каждая библиотека, которую мы анализируем в этом учебнике, предоставляет Предикат реализация , но все же, все они определяются как функциональные интерфейсы, что позволяет нам использовать функции Lambda, чтобы объявить их.

В этом случае мы использовали предопределенную Коллекционные предоставлено Java, которая аккумулирует элементы в Список , но мы могли бы использовать другие, как обсуждалось в этот предыдущий пост .

2.2. Фильтрация после группирования коллекции на Java 9

Потоки позволяют агрегировать элементы с помощью группированияБир коллектора.

Тем не менее, если мы фильтруем, как мы это делали в последнем разделе, некоторые элементы могут быть отброшены на ранней стадии, прежде чем этот коллектор вступает в игру.

По этой причине фильтрация коллектор был введен с Java 9, с целью обработки подколлекций после того, как они были сгруппированы.

Следуя нашему примеру, давайте представим, что мы хотим сгруппировать нашу коллекцию на основе количества цифр, которые имеет каждый Integer, прежде чем отфильтровать нечетные числа:

public Map> findEvenNumbersAfterGrouping(
  Collection baseCollection) {
 
    Function getQuantityOfDigits = item -> (int) Math.log10(item) + 1;
    
    return baseCollection.stream()
      .collect(groupingBy(
        getQuantityOfDigits,
        filtering(item -> item % 2 == 0, toList())));
}

Короче говоря, если мы используем этот коллектор, мы можем в конечном итоге с пустой вход значения, в то время как если мы фильтруем перед группировкой, коллектор не будет создавать такую запись на всех.

Конечно, мы бы выбрали подход, основанный на наших требованиях.

3. Использование коллекций Eclipse

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

Так об этом говорится в Коллекции затмения , библиотека, которая стремится идти в ногу с новыми парадигмами, развивается и охватывает изменения, внесенные всеми последними релизами Java.

Мы можем начать с изучения наших Eclipse Коллекции Вводный пост, чтобы иметь более широкое знание функциональности, предоставляемой этой библиотекой.

3.1. Зависимости

Начнем с добавления следующей зависимости к проекту нашего пом.xml :


    org.eclipse.collections
    eclipse-collections
    9.2.0

затмение-коллекции включает в себя все необходимые интерфейсы структуры данных и сам API.

3.2. Фильтрация коллекции с коллекциями Eclipse

Теперь давайте использовать функцию фильтрации затмения на одной из структур данных, таких как его Мутируемыйлист :

public Collection findEvenNumbers(Collection baseCollection) {
    Predicate eclipsePredicate
      = item -> item % 2 == 0;
 
    Collection filteredList = Lists.mutable
      .ofAll(baseCollection)
      .select(eclipsePredicate);

    return filteredList;
}

В качестве альтернативы мы могли бы использовать Итерировать ‘ы выберите () статический метод определения фильтрованныйlist объект:

Collection filteredList
 = Iterate.select(baseCollection, eclipsePredicate);

4. Использование коллекции ApacheUtils

Чтобы начать работу с КоллекцияУтилс библиотека, мы можем проверить этот короткий учебник где мы рассмотрели его использования.

В этом учебнике, однако, мы сосредоточимся на его фильтр () реализация.

4.1. Зависимости

Во-первых, нам нужны следующие зависимости в нашем пом.xml файл:


    org.apache.commons
    commons-collections4
    4.2

4.2. Фильтрация коллекции с помощью CollectionUtils

Теперь мы готовы использовать ‘ методы:

public Collection findEvenNumbers(Collection baseCollection) {
    Predicate apachePredicate = item -> item % 2 == 0;

    CollectionUtils.filter(baseCollection, apachePredicate);
    return baseCollection;
}

Мы должны учитывать, что этот метод изменяет базаКоллеция удалив каждый элемент, который не соответствует условию.

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

5. Использование коллекций Гуавы2

Как и прежде, мы можем прочитать наш предыдущий пост “Фильтрация и преобразование коллекции в Гуаве” для получения дополнительной информации по этому вопросу.

5.1. Зависимости

Начнем с добавления эта зависимость в нашем пом.xml файл:


    com.google.guava
    guava
    25.1-jre

5.2. Фильтрация коллекции с коллекциями2

Как мы видим, этот подход довольно похож на тот, который был в последнем разделе:

public Collection findEvenNumbers(Collection baseCollection) {
    Predicate guavaPredicate = item -> item % 2 == 0;
        
    return Collections2.filter(baseCollection, guavaPredicate);
}

Опять же, здесь мы определяем гуаву конкретных Предикат объект.

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

6. Заключение

Таким образом, мы видели, что в Java существует множество различных способов фильтрации коллекций.

Несмотря на то, что Streams, как правило, предпочтительный подход, его хорошо знать и иметь в виду функциональность, предлагаемую другими библиотеками.

Особенно, если нам нужно поддерживать старые версии Java. Однако, если это так, мы должны иметь в виду последние функции Java, используемые во всем учебнике, такие как lambdas должны быть заменены анонимными классами.

Как обычно, мы можем найти все примеры, показанные в этом учебнике в нашем Github репо .