Статьи
Утилиты Telegram YouTube Отзывы

Статьи с тэгом «Stream API»

Работа с БД в Spring Boot на примере postgresql

28 декабря 2023

Тэги: Spring Boot, rest, SQL, PostgreSQL, Java, Stream API, руководство.

Данная статья является продолжением Spring Boot Restful Service, где была бы раскрыта тема работы с БД в Spring Boot. Давайте рассмотрим эту тему подробнее на примере СУБД postgresql, а в качестве основы возьмём проект, который мы делали в той статье.

Напомню, что проект представляет из себя простой restful-service, который принимает GET-запрос по HTTP и возвращает профиль пользователя по его id.

Создание и заполнение таблицы

Сам профиль содержит кроме id также имя, фамилию и возраст. Поэтому создадим таблицу profile в базе данных.

CREATE TABLE public.profile
(
    id         serial,
    first_name character varying(50) NOT NULL,
    last_name  character varying(50) NOT NULL,
    age        integer               NOT NULL,
    CONSTRAINT profile_id_pk PRIMARY KEY (id)
);

insert into profile (first_name, last_name, age)
values ('Иван', 'Петров', 23);

Для поля id можно использовать тип serial. Он представляет собой целое число, которое увеличивается на 1 автоматически при вставке новой записи в таблицу.

Читать полностью...

Работа с коллекциями

2 ноября 2023

Тэги: Kotlin, Java, Collections, Stream API.

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

Создаём класс-сущность

Для того, чтобы нам было от чего отталкиваться, создадим класс-сущность. Это класс, предназначенный для хранения данных. Часто в приложениях поля таких классов мапятся один к одному на поля таблицы в базе данных. Для примера рассмотрим сущность «Город», у которой есть два атрибута: название и количество проживающих в нём людей.

Читать полностью...

Построчное чтение больших файлов

10 мая 2022

Тэги: Java, Collections, файлы, руководство, Stream API.

В предыдущей статье Как сохранить текстовый файл мы научились записывать текстовый файл больших размеров. А в этот раз давайте научимся его читать построчно и каждую строку как-то обрабатывать. Например, будем искать наибольшую длину строки. Поскольку размер файла больше 100 МБ, его чтение происходит с небольшой задержкой.

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

Читать полностью...

Как парсить HTML с помощью Jsoup

10 апреля 2022

Тэги: XML, maven, Java, Collections, руководство, Stream API.

Если вы пишете робота на Java для разбора контента с каких-либо сайтов (т.н. «краулер»), то вы можете встретиться с некоторыми сложностями. Язык HTML хоть и формализован, однако допускает ошибки в разметке без нарушения отображения, в отличие от более строгого XML. Самой частой ошибкой является незакрытый тэг.

Страница в браузере может выглядеть корректно, но при попытке разобрать вёрстку вы потерпите неудачу. Кроме html 5-ой версии, существует ещё несколько стандартов вёрстки.

Чтобы не изобретать велосипед, можно воспользоваться готовой библиотекой Jsoup, которая позволяет легко парсить исходный html и выбирать оттуда отдельные элементы в простом декларативном синтаксисе. Библиотека поддерживает выбор как в формате CSS (более привычный на frontend), так и в XPath.

Читать полностью...

Как получить все даты в указанном диапазоне

26 января 2020

Тэги: Stream API, Java, Collections.

Предположим, у нас есть дата начала dateTill и дата окончания dateFrom некоторого временного диапазона. И нам нужно получить список, содержащий все даты из этого диапазона. Как это сделать? Есть два варианта.

Вариант для Java 9

Если у вас Java версии 9 или более поздняя, то можно использовать такой лаконичный вариант:

public List<LocalDate> getDatesFromInterval(LocalDate dateFrom, LocalDate dateTill) {
    return dateFrom.datesUntil(dateTill.plusDays(1))
            .collect(Collectors.toList());
}

Метод LocalDate.datesUntil() порождает поток, начинающийся с указанной даты и заканчивающийся датой, переданной в этот метод в качестве параметра. Чтобы конечная дата также попала в выборку, прибавляем к ней ещё один день с помощью метода plusDays(). В конце превращаем этот поток в список, используя метод collect().

Читать полностью...

Вычисление размера директории

25 января 2020

Тэги: алгоритмы, Stream API, файлы, Java.

При работе с файловой системой может потребоваться вычислить размер папки (folder) с лежащими в ней файлами. Как известно, директория – это лишь логический раздел на файловой системе, поэтому её размер равняется сумме размеров всех файлов, находящихся внутри неё. При этом нужно пройтись по всей иерархии файлов и папок, находящихся внутри.

public long getFolderSize(String path) throws IOException {
    Path folder = Paths.get(path);
    return Files.walk(folder)
            .map(Path::toFile)
            .filter(File::isFile)
            .mapToLong(File::length)
            .sum();
}

Сначала создадим объект папки с помощью метода Paths.get(). В него передадим полный путь до интересующей нас папки. Этот путь мы получаем в качестве параметра нашего метода.

Читать полностью...

Терминальные операции Stream API

8 апреля 2019

Тэги: Collections, Stream API, Java.

Ранее мы уже рассмотрели Промежуточные операции Stream API, а сейчас рассмотрим терминальные (конечные).

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

Преобразование в коллекцию

Самая распространённая терминальная операция collect(). Результатом может быть, например, список.

List<String> fruits = Stream.of("apple", "banana", "lemon", "orange")
        // здесь могут быть ещё какие-то преобразования
        .collect(Collectors.toList());

А можно преобразовать стрим из строк в мапу, причём ключом сделать первую букву соответствующего слова:

Map<String, String> fruits = Stream.of("apple", "banana", "lemon", "orange")
        .collect(Collectors.toMap(e -> e.substring(0, 1), e -> e));
        // {a=apple, b=banana, l=lemon, o=orange}
Читать полностью...

Промежуточные операции Stream API

7 апреля 2019

Тэги: Stream API, Collections, Java.

Все методы Stream API можно разделить на две группы: промежуточные и терминальные (конечные). Промежуточные операции следует воспринимать как «отложенные», т.е. они не меняют сами данные, а только задают правила их изменения. А терминальные как раз инициируют всю цепочку преобразований и возвращают модифицированные данные.

Рассмотрим промежуточные операции. Все промежуточные операции возвращают типизированный интерфейс Stream<>.

Преобразование

Любое изменение исходного элемента можно делать с помощью метода map(). В качестве параметра метод принимает лямбда-выражение.

Stream.of(1, 2, 3, 4, 5, 6)
        .map(n -> n * 10) // умножает каждый элемент на 10
Stream.of("apple", "orange")
        .map(String::toUpperCase) // преобразует буквы в каждом слове в верхний регистр

Во втором случае мы воспользовались краткой записью лямбда-выражения через method reference.

Читать полностью...

Stream API

27 апреля 2018

Тэги: Stream API, Collections, Java.

В Java 8 появилось довольно важное нововведение под названием Stream. И здесь имеются в виду не потоки ввода/вывода. Stream – это абстракция, позволяющая с любыми объектами работать как с потоками данных. Порой это чем-то похоже на выполнение запросов к БД. Рассмотрим несколько типовых задач, с которыми часто сталкивается каждый разработчик.

Объединение нескольких строк в одну

Наверняка вам приходилось генерить одну строку из нескольких других, разделённых запятыми. При этом после последнего элемента запятой быть не должно. Знакомо? В java 8 это делается так:

Stream.of("Linux", "Windows", "Mac")
    .collect(Collectors.joining(", ")));

Мы создаём новый поток из простых строк, а затем собираем их в одну при помощи метода collect(). В результате получим следующую строку:

Читать полностью...

Генерация случайных чисел при помощи Stream API

10 января 2018

Тэги: Collections, Stream API, Java.

В Java 8 у класса java.util.Random появился набор удобных методов для генерации стримов (Stream) случайных чисел для всех основных числовых типов. Например:

private List<Integer> randomIntsGenerator() {
    return new Random()
            .ints(25, 1, 6)
            .boxed()
            .collect(Collectors.toList());
}
Читать полностью...

Далее ❯