27 апреля 2018
Тэги: Collections, Java, Stream API.
В Java 8 появилось довольно важное нововведение под названием Stream. И здесь имеются в виду не потоки ввода/вывода. Stream – это абстракция, позволяющая с любыми объектами работать как с потоками данных. Порой это чем-то похоже на выполнение запросов к БД. Рассмотрим несколько типовых задач, с которыми часто сталкивается каждый разработчик.
Наверняка вам приходилось генерить одну строку из нескольких других, разделённых запятыми. При этом после последнего элемента запятой быть не должно. Знакомо? В java 8 это делается так:
Мы создаём новый поток из простых строк, а затем собираем их в одну при помощи метода collect(). В результате получим следующую строку:
Сгенерим три знака вопроса и вставим между ними запятые, аналогично предыдущей задаче:
Получим:
Потоки могут работать с любыми типами объектов. Давайте создадим простой класс (модель данных), представляющий имя и возраст человека. Для наглядности также переопределим метод toString():
Теперь инициализируем коллекцию, которую потом будем преобразовывать.
Выберем всех пользователей не старше 30 лет и выведем каждого из них на экран:
Обратите внимание, что Stream можно получить из любой коллекции при помощи метода stream(). Затем в методе filter() используем лямбда-выражение (вместо p можно использовать любое другое имя). В качестве выражения фильтрации можно использовать абсолютно любое выражение, возвращающее тип boolean. И наконец, для каждого из оставшихся элементов мы вызываем статическую функцию println(). Обратите внимание на её особую запись. Эту запись можно использовать в стримах для любого метода, принимающего один параметр.
В результате на экране увидим Боба и Алису, а вот Николаю Петровичу не повезло:
Подсчитаем средний возраст наших персон, используя другой коллектор:
Для метода Person.getAge() опять используем сокращённую запись. В результате получим, что средний возраст составляет 35,0 лет.
Создадим новый стрим из строк, каждая из которых будет представлять имя персоны в верхнем регистре:
Результат:
Прочитать все строки текстового файла и объединить их в одну строку можно так:
Обратите внимание, что для объединения строк здесь используется специальный метод System.lineSeparator(), возвращающий один или два символа перевода строки в зависимости от вашей ОС.
Похожим образом производится и запись строк в файл:
На выходе получим файл, состоящий из двух строк.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.