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, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.