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

Статьи с тэгом «руководство»

Перебор элементов через Iterator в Java

11 февраля 2024

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

Интерфейсы Iterator и Iterable часто используются для работы с коллекциями в Java. Они позволяют эффективно и безопасно работать с коллекциями, обеспечивая контроль над процессом перебора элементов (итерации).

Интерфейс Iterator

Паттерн Итератор

Интерфейс Iterator представляет собой одноимённый шаблон проектирования «Итератор» и содержит несколько методов. Нас интересуют два из них:

interface Iterator<E> {

    boolean hasNext();

    E next();
}
  1. Метод hasNext(), который возвращает true при наличии следующего элемента.
  2. Метод next(), который сдвигает указатель итератора на следующий элемент и возвращает этот элемент в качестве результата. Если доступных элементов не осталось – метод кидает исключение NoSuchElementException.

Пример использования интерфейса Iterator:

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

Как скомпилировать исходники java вручную

13 января 2024

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

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

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

Класс Greeter содержит метод sayHello(). Этот метод выводит приветствие на экран:

package ru.devmark.helper;

public class Greeter {
    public void sayHello() {
        System.out.println("Привет, мир!");
    }
}

Сохраним этот исходный код в текстовый файл, имя которого обязательно должно совпадать с именем класса, т.е. Greeter.java.

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

Inline-кнопки в telegram-боте

29 декабря 2023

Тэги: Spring Boot, руководство, Kotlin.

В предыдущей статье Telegram-бот на Kotlin и Spring Boot мы написали telegram-бота на Kotlin и Spring Boot. Мы рассмотрели, как добавляются простые команды, команды с параметрами, а также научились отображать простые кнопки в клиентском приложении telegram.

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

Добавляем поддержку обратных вызовов

Предположим, вы решили написать онлайн-квиз в виде Telegram-бота. Бот должен выдать вопрос и какие-то варианты ответа к нему. Если это делать с помощью обычных кнопок, то довольно сложно сопоставить ответ пользователя с конкретным вопросом, т.к. обычные кнопки не хранят контекст. Но есть встраиваемые (inline) кнопки, которые относятся непосредственно к сообщению. Они добавляют гораздо больше интерактива и именно их вы видели, когда регистрировали бота в BotFather.

inline-кнопки в Bot Father

Встроенные кнопки взаимодействуют с ботом в фоновом режиме при помощи обратных вызовов (callback). Поэтому имеет смысл создать отдельный набор классов и интерфейсов для их поддержки.

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

Удаление записи через DELETE-запрос в Spring Boot

28 декабря 2023

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

В статье Обновление записи через PUT-запрос в Spring Boot мы научились обновлять данные в БД. Теперь попробуем создать полноценный rest-интерфейс для удаления существующих записей.

За основу возьмём наше приложение из указанной статьи. Оно состоит из трёх слоёв: репозиторий (работа с БД), бизнес-логика приложения (service) и сам rest-интерфейс (controller), который обрабатывает входящий json и генерирует исходящий.

Репозиторий

Начнём с доработки репозитория (интерфейс ProfileRepository).

void deleteProfileById(int id);

Для удаления нам достаточно знать только id записи.

В реализацию интерфейса репозитория (ProfileRepositoryImpl) добавим sql-запрос в виде константы, которую принято размещать в начале класса:

private static final String SQL_DELETE_PROFILE = "delete from profile where id = :id";
Читать полностью...

Обновление записи через PUT-запрос в Spring Boot

28 декабря 2023

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

В предыдущей статье Добавление записи через POST-запрос в Spring Boot мы научились создавать новые записи в БД. Теперь попробуем создать полноценный rest-интерфейс для обновления ранее добавленных записей.

За основу возьмём наше приложение из указанной статьи. Оно состоит из трёх слоёв: репозиторий (работа с БД), бизнес-логика приложения (service) и сам rest-интерфейс (controller), который обрабатывает входящий json и генерирует исходящий.

Репозиторий

Начнём с доработки репозитория (интерфейс ProfileRepository).

void updateProfile(String firstName, String secondName, int age, int id);

Для обновления нам потребуется указать id записи, а также остальные значимые поля.

В реализацию интерфейса dao (ProfileRepositoryImpl) добавим sql-запрос в виде константы, которую принято размещать в начале класса:

private static final String SQL_UPDATE_PROFILE =
        "update profile set first_name = :firstName, last_name = :lastName, age = :age where id = :id";
Читать полностью...

Добавление записи через POST-запрос в Spring Boot

28 декабря 2023

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

В статье Работа с БД в Spring Boot на примере postgresql мы узнали как читать данные из БД. Но чтение данных – это лишь малая часть всех операций, которые встречаются в типичном java-приложении. Теперь попробуем создать полноценный rest-интерфейс для добавления новых записей, их модификации и удаления.

За основу возьмём наше приложение из указанной статьи. Оно состоит из трёх слоёв: работа с БД (repository), бизнес-логика приложения (service) и сам rest-интерфейс (controller), который обрабатывает входящий json и генерирует исходящий.

Репозиторий

Начнём с доработки репозитория (интерфейс ProfileRepository), где до сих пор был только один метод чтения данных. Добавим метод вставки записи в БД:

void insertProfile(String firstName, String secondName, int age);

При добавлении новой записи нам достаточно всего три поля. id будет сгенерирован в БД автоматически.

В реализацию интерфейса ProfileRepositoryImpl добавляем sql-запросы в виде констант, которые принято размещать в начале класса:

private static final String SQL_INSERT_PROFILE =
        "insert into profile (first_name, last_name, age) values (:firstName, :lastName, :age)";
Читать полностью...

Работа с БД в 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 автоматически при вставке новой записи в таблицу.

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

Spring Boot Restful Service

28 декабря 2023

Тэги: maven, rest, Spring Boot, Java, руководство, json.

Что мы получим в результате

Простой сервис на Spring Boot, который при выполнении get-запроса будет возвращать профиль пользователя в формате json в зависимости от id, который передаётся в запросе. При возникновении исключительных ситуаций (например, профиль не найден), пользователь получит соответствующий ответ.

Реализуем обработку get-запроса

Сразу оговорюсь, что здесь рассмотрю только создание самого веб-сервиса. Чаще всего, он будет обращаться к базе для получения профиля пользователя. Мы же этого здесь делать не будем, а только сымитируем загрузку профиля по id. Но всё, что касается взаимодействия по http, будет работать как положено.

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

Давайте с помощью Spring Initializr создадим новый проект, в котором в качестве сборщика укажем maven, в качестве языка – Java 21 (поскольку это самая свежая версия с длительной поддержкой на текущий момент) и добавим одну зависимость Spring Web. Этого вполне достаточно для нашего проекта.

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

Telegram-бот на Kotlin и Spring Boot

27 декабря 2023

Тэги: Spring Boot, Kotlin, gradle, YouTube, руководство, yaml.

В настоящее время чат-боты в Telegram не делал только ленивый. Они плотно вошли в нашу жизнь и почти у каждой компании есть бот, решающий какие-то задачи бизнеса, тем самым разгружая «живых» сотрудников. После прочтения этой статьи вы сможете создать и запустить свой чат-бот в Telegram.

Telegram-бот на Kotlin и Spring Boot

Пример готового приложения можно найти на github.

Регистрация бота в Telegram

Сперва нам нужно выбрать подходящее имя для бота и зарегистрировать его в Telegram. Регистрация происходит через главного бота по имени BotFather. Просто найдите его через поиск контактов Telegram. В чате вы всегда можете понять, что общаетесь с ботом, т.к. рядом с его именем есть подпись «bot». BotFather позволяет управлять вашими ботами в диалоговом режиме. Команды боту представляют собой текст, начинающийся со слеша.

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

Value-классы в Kotlin

11 декабря 2023

Тэги: ООП, Kotlin, руководство.

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

Описание задачи

Например, пусть у вас есть метод calculateDensity(), вычисляющий плотность вещества как массу, делённую на объём. Оба параметра передаём как тип Double:

fun calculateDensity(weight: Double, volume: Double): Double =
    weight / volume

Тогда вызов этого метода может выглядеть вот так:

fun main() {
    val density = calculateDensity(3.0, 2.0)
    println("Density: $density.")
}

Вроде всё тривиально, но без подсказок IDE довольно легко перепутать объём и плотность местами при вызове метода. И если такое произойдёт, компилятор вам никак не поможет.

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

Далее ❯