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

Введение в Streamyx

Вводное руководство по использованию библиотеки StreamEx в Java.

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

1. Обзор

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

Streamyx – это библиотека, которая предоставляет дополнительные функции для стандартного API потока наряду с улучшением производительности.

Вот несколько основных функций:

  • Более короткие и удобные способы выполнения повседневных задач
  • 100% совместимость с оригинальными JDK потоками
  • Удобство параллельной обработки: любая новая функция максимально использует преимущества параллельных потоков
  • Производительность и минимальные накладные расходы. Если Streamyx позволяет решать задачу с использованием меньшего количества кода по сравнению со стандартным Stream, он не должен быть значительно медленнее, чем обычный способ (а иногда даже быстрее)

В этом уроке мы представим некоторые функции Streamyx API.

2. Настройка примера

Чтобы использовать Streamyx , нам нужно добавить следующую зависимость в pom.xml :


    one.util
    streamex
    0.6.5

Последнюю версию библиотеки можно найти на Maven Central .

В этом уроке мы будем использовать простой класс User :

public class User {
    int id;
    String name;
    Role role = new Role();

    // standard getters, setters, and constructors
}

И простой Роль класс:

public class Role {
}

3. Методы быстрого доступа коллекторов

Одной из самых популярных терминальных операций Streams является операция collect ; это позволяет переупаковывать элементы Stream в коллекцию по нашему выбору.

Проблема в том, что код может быть излишне подробным для простых сценариев:

users.stream()
  .map(User::getName)
  .collect(Collectors.toList());

3.1. Сбор в коллекцию

Теперь, с Streamyx, нам не нужно предоставлять Collector , чтобы указать, что нам нужен List , Set, Map, Immutablelist и т. Д.:

List userNames = StreamEx.of(users)
  .map(User::getName)
  .toList();

То собирать операция по-прежнему доступна в API, если мы хотим выполнить что-то более сложное, чем взятие элементов из Течение и собрать их в коллекцию.

3.2. Продвинутые коллекторы

Другое сокращение – группировка по :

Map> role2users = StreamEx.of(users)
  .groupingBy(User::getRole);

Это приведет к созданию Map с типом ключа, указанным в ссылке на метод, что приведет к созданию чего-то похожего на операцию group by в SQL.

Используя простой Stream API, нам нужно будет написать:

Map> role2users = users.stream()
  .collect(Collectors.groupingBy(User::getRole));

Аналогичную сокращенную форму можно найти для Collectors.joining():

StreamEx.of(1, 2, 3)
  .joining("; "); // "1; 2; 3"

Который принимает все элементы в потоке a, создает строку , объединяющую их все.

4. Добавление, удаление и выбор элементов

В некоторых сценариях у нас есть список объектов разных типов, и нам нужно отфильтровать их по типу:

List usersAndRoles = Arrays.asList(new User(), new Role());
List roles = StreamEx.of(usersAndRoles)
  .select(Role.class)
  .toList();

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

List appendedUsers = StreamEx.of(users)
  .map(User::getName)
  .prepend("(none)")
  .append("LAST")
  .toList();

Мы можем удалить ненужные нулевые элементы с помощью non Null() и использовать Поток в качестве итерируемого :

for (String line : StreamEx.of(users).map(User::getName).nonNull()) {
    System.out.println(line);
}

5. Поддержка математических операций и примитивных типов

Streamyx добавляет поддержку примитивных типов, как мы можем видеть в этом самоописывающемся примере:

short[] src = {1,2,3};
char[] output = IntStreamEx.of(src)
  .map(x -> x * 5)
  .toCharArray();

Теперь давайте возьмем массив double элементов в неупорядоченном виде. Мы хотим создать массив, состоящий из разницы между каждой парой.

Мы можем использовать метод pair Map для выполнения этой операции:

public double[] getDiffBetweenPairs(double... numbers) {
    return DoubleStreamEx.of(numbers)
      .pairMap((a, b) -> b - a)
      .toArray();
}

6. Операции с картой

6.1. Фильтрация по ключам

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

В этом случае мы берем все ненулевые значения:

Map nameToRole = new HashMap<>();
nameToRole.put("first", new Role());
nameToRole.put("second", null);
Set nonNullRoles = StreamEx.ofKeys(nameToRole, Objects::nonNull)
  .toSet();

6.2. Работа с парами ключ-значение

Мы также можем работать с парами ключ-значение, создавая Поток ввода экземпляр:

public Map> transformMap( 
    Map> role2users) {
    Map> users2roles = EntryStream.of(role2users)
     .flatMapValues(List::stream)
     .invert()
     .grouping();
    return users2roles;
}

Специальная операция EntryStream.of берет Карту и преобразует ее в Поток объектов ключ-значение. Затем мы используем операцию flatMapValues для преобразования нашего списка ролей в Поток с отдельными значениями.

Затем мы можем инвертировать пару ключ-значение, сделав класс User ключом, а класс Role – значением.

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

6.3. Сопоставление Ключ-значение

Мы также можем сопоставлять ключи и значения независимо друг от друга:

Map mapToString = EntryStream.of(users2roles)
  .mapKeys(String::valueOf)
  .mapValues(String::valueOf)
  .toMap();

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

7. Операции с файлами

Используя Streamyx , мы можем эффективно читать файлы, т. Е. не загружая полные файлы сразу. Это удобно при обработке больших файлов:

StreamEx.ofLines(reader)
  .remove(String::isEmpty)
  .forEach(System.out::println);

Обратите внимание, что мы использовали метод remove() для фильтрации пустых строк.

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

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

В этом уроке мы узнали о Streamyx , и это разные утилиты. Есть еще много чего, через что нужно пройти – и у них есть удобная шпаргалка здесь .

Как всегда, полный исходный код доступен на GitHub .