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

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

Функциональные интерфейсы в Java

3 марта 2025

Тэги: Java, Stream API, ООП.

В основе Stream API, которое значительно упрощает работу с коллекциями в Java, лежит понятие функциональных интерфейсов.

Функциональные интерфейсы и лямбда-выражения

Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией @FunctionalInterface.

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

Вычисление контрольной суммы файла

30 января 2025

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

Контрольная сумма от набора байт позволяет убедиться в том, что данные на клиенте, полученные от сервера, являются корректными. Для этого вместе с файлом сервер может предоставлять контрольную сумму для проверки на клиентской стороне. Существует несколько алгоритмов вычисления контрольной суммы, рассмотрим самые популярные: md5, sha-256, sha-512 и crc-32.

Вычисление md5 с помощью MessageDigest

В пакете java.security есть такой класс как MessageDigest. Он позволяет получить одну из встроенных реализаций алгоритма вычисления контрольных сумм. Поэтому сначала реализуем метод, который абстрагирован от конкретного алгоритма и работает с любым MessageDigest одинаково.

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

Алгоритм поиска суммы двух элементов в массиве

27 января 2025

Тэги: алгоритмы, Java, Collections.

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

Например, если дан массив [2, 7, 11, 15] и целевая сумма равна 9, то правильным ответом будут индексы 0 и 1 (то есть первый и второй элементы массива), т.к. 2 + 7 = 9.

Алгоритм поиска суммы двух элементов в массиве

Рассмотрим несколько вариантов реализации этого алгоритма.

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

Валидация бинов в Spring

23 января 2025

Тэги: Java, Spring, json, maven, rest.

Spring позволяет проверять входящие запросы в декларативном стиле при помощи специальных аннотаций из пакета jakarta.validation.

Создадим простой проект на Java и добавим в pom.xml следующие зависимости:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Компонент spring-boot-starter-web добавляет базовый функционал по работе с rest-контроллерами, а spring-boot-starter-validation – сам механизм валидации.

Теперь создадим rest-контроллер для работы с пользователями. В нём есть метод, создающий нового пользователя. Согласно restful-соглашениям, это будет POST-запрос:

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public String createUser(@Valid @RequestBody CreateUserRequest request) {
        // создание пользователя в БД
        return "Пользователь создан успешно!";
    }
}

На вход метод принимает CreateUserRequest, который мы будем передавать в формате json. Этот параметр метода снабжён аннотациями @RequestBody (говорит, что параметры будут именно в теле запроса) и @Valid (аннотация, которая активирует механизм валидации для данного бина). Если не указать аннотацию @Valid, то валидация работать не будет!

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

Кеширование в Spring Boot

19 ноября 2024

Тэги: Spring Boot, maven, Java, rest.

Spring Boot поддерживает простой механизм кеширования данных. Рассмотрим его на примере, исходники которого доступны на github.

Подключение зависимостей

Создадим стандартное приложение Spring Boot. Это удобно делать через Spring Initializr.

Добавим в pom.xml две зависимости:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Зависимость spring-boot-starter-web – это базовая функциональность нашего веб-приложения, в том числе поддержка rest-контроллеров. Зависимость spring-boot-starter-cache добавляет возможность кеширования.

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

Алгоритм поиска чисел Фибоначчи

15 ноября 2024

Тэги: алгоритмы, Java, головоломки, Kotlin.

Немного теории

На собеседованиях по алгоритмам любят давать такую задачку, как нахождение чисел из последовательности Фибоначчи. Эта числовая последовательность названа в честь Леонардо Пизанского – известного математика Средневековья.

Сама последовательность довольно проста. Она состоит из целых положительных чисел, где каждый следующий элемент равен сумме двух предыдущих. Например, 2 = 1 + 1, 3 = 2 + 1, 5 = 3 + 2.

Последовательность начинается с 0 и 1:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 ...

Иногда в этой последовательности принято пропускать 0 и начинать её с двух единиц, однако официально она начинается именно с 0.

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

Настройка Ubuntu под хостинг JVM приложения

14 ноября 2024

Тэги: Spring, руководство, Java, gradle, maven, PostgreSQL, SQL, Nginx, Linux, devops.

Если Вам интересно, как настроить сервер для хостинга JVM приложения, то предлагаю вашему вниманию следующую инструкцию. Предположим, вы только что получили доступ к чистому VPS серверу, на котором крутится Ubuntu и вы хотите на нём развернуть полноценное JVM приложение, основанное на Spring. Для полноты картины мы настроим также локальный postgres и доступ извне по http.

Прежде всего обновляем индекс менеджера пакетов apt. У вас должно быть достаточно прав для выполнения sudo, а также ваш сервер должен иметь доступ в Интернет.

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

Интерфейсы Comparable и Comparator

10 июня 2024

Тэги: Java, Collections, ООП.

Интерфейсы Comparable и Comparator в Java

Интерфейсы Comparable и Comparator, как и Iterable и Iterator (см. Перебор элементов через Iterator), являются частью Java Collections. Подобно тому, как Iterable наделяет объекты свойством перебора в цикле, так и Comparable («сравниваемый») наделяет объекты свойством сравнимости между собой.

Интерфейс Comparable

Данный интерфейс предоставляет универсальный способ сравнивать два объекта между собой. Его контракт состоит из единственного метода compareTo():

interface Comparable<T> {
    int compareTo(T other);
}

Метод сравнивает текущий объект this с другим объектом того же типа other, который передали в параметре. В качестве результата метод возвращает целое число. Этот результат определяется контрактом данного метода и должен принимать одно из следующих значений:

  • 0 – если объекты равны
  • положительное число – если this > other
  • отрицательное число – если this < other
Читать полностью...

Выравнивание числа ведущими нулями

12 мая 2024

Тэги: Java, maven, Apache.

Рассмотрим случай, когда у вас есть некое число, количество цифр в котором заранее неизвестно и вам необходимо, чтобы число всегда составляло 5 знаков, то есть нужно добавить необходимое количество нулей слева. Есть целых два способа сделать это.

Без использования сторонних библиотек

Если у вас небольшой проект и не хочется тянуть лишнюю зависимость, то используйте String.format():

System.out.println(String.format("%05d", 42));

В результате мы увидим строку «00042». К недостаткам данного способа можно отнести то, что нужно помнить правила форматирования в методе String.format().

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

Генерация строки на основе шаблона

12 мая 2024

Тэги: maven, Apache, Java.

Предположим, вам нужно генерить текст по определённому шаблону. У вас есть заранее заготовленный текст, куда вы передаёте параметры для подстановки. Например, текст sms для клиента.

Самое первое, что приходит на ум – это воспользоваться методом String.format(). Как известно, он чувствителен к порядку следования элементов. Но что, если сам шаблон лежит у вас где-нибудь в базе данных и может измениться в любое время, а порядок параметров «зашит» в коде самого приложения? Согласитесь, было бы удобнее, чтобы каждый параметр подставлялся по имени, а не по порядку.

Следующее, что можно попробовать – это метод String.replace(). Но чтобы не писать очередной велосипед, лучше воспользоваться классом org.apache.commons.text.StringSubstitutor из популярной библиотеки Apache Commons Text.

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

Далее ❯