Статьи Утилиты Telegram YouTube VK Видео RuTube Отзывы

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

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

8 марта 2026

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

Пример добавления в приложение на Spring Boot слоя взаимодействия с БД. Также создаём новую реализацию сервисного слоя, который вместо заглушки теперь использует репозиторий.
Читать полностью...

Spring Boot Restful Service

8 марта 2026

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

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

Эволюция языков программирования

7 марта 2026

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

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

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

29 октября 2025

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

Терминальные операции в Stream API как раз инициируют всю цепочку преобразований, закрывают поток и возвращают модифицированные данные. Закрытый поток повторно использовать нельзя.
Читать полностью...

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

28 октября 2025

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

Все методы Stream API в Java можно разделить на две группы: промежуточные и терминальные (конечные). Промежуточные операции следует воспринимать как "отложенные", т.е. они не меняют сами данные, а только задают правила их изменения.
Читать полностью...

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

21 октября 2025

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

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

Compact Sources в Java

15 октября 2025

Тэги: Java.

Java 25 принесла нам такие фичи как Compact Sources и Instance Main Methods (JEP 512). Теперь мы можем писать на Java как на скриптовом языке: без создания классов, без модификаторов доступа и без явных импортов. Это значительно снижает порог входа для новичков, ведь раньше нужно было объяснять что такое класс, что такое public, static, маccив строк.

Сравните, как выглядела самая простая программа до Java 25:

public class Main {
    public static void main(String[] args) {
        System.out.println("Привет, мир!");
    }
}

И как выглядит её эквивалент теперь:

void main() {
    IO.println("Привет, мир!");
}

Теперь фиктивная обёртка в виде класса становится необязательной, а System.out получил компактный алиас в виде IO.

На уровне компилятора тут никакой магии нет. Наши методы всё так же оборачиваются в некий класс. При этом имя такого класса удаляется из таблицы символов, чтобы нельзя было его создать с помощью new. То есть для программиста такой класс-обёртка недоступен.

Также необходимо дополнить, что сейчас не обязательно компилировать программу с помощью javac. Мы можем запускать исходники прямо из командной строки. Эта возможность появилась уже довольно давно, ещё в Java 10.

java Main.java
Привет, мир!

Отсюда кстати следует интересный вывод, что для запуска скрипта на java вам даже не нужен JDK со средствами компиляции, достаточно JRE.

Новый класс IO

Для упрощения работы с консолью у нас появился новый класс IO, который оборачивает некоторые методы из System.out и System.in. Он содержит всего пять методов:

public final class IO {
    public static void println(Object obj);

    public static void println();

    public static void print(Object obj);

    public static String readln();
    
    public static String readln(String prompt);
}

Наверняка вы помните, что считать строку из консоли в Java было чуть сложнее, чем вывести её на экран. Теперь всё это в прошлом.

Поскольку класс IO находится в пакете java.lang, то импортировать его в явном виде не требуется. Однако Compact Source файл должен находится в корневом пакете (т.е. в папке src). Это позволяет нам избавиться от объявления package.

Теперь давайте рассмотрим несколько примеров.

Вызов других методов

Допустим, я сначала хочу запросить имя у пользователя, чтобы затем его поприветствовать:

// почти javascript
void main() {
    var name = IO.readln("Как Вас зовут? ");
    IO.println("Добро пожаловать, " + name + "!");
}

Ничто не мешает мне создавать другие методы в этом же файле:

void main() {
    var name = IO.readln("Как Вас зовут? ");
    displayMessage(name);
}

void displayMessage(String name) {
    IO.println("Добро пожаловать, " + name + "!");
}

Передача параметров из командной строки

Как и раньше, я могу передать параметры из командной строки как параметры метода main:

void main(String[] args) {
    if (args.length > 1) {
        displayMessage(args[0]);
    } else {
        // параметры командной строки не указаны
        displayMessage(IO.readln("Как Вас зовут? "));
    }
}

void displayMessage(String name) {
    IO.println("Добро пожаловать, " + name + "!");
}

Тогда при вызове программы из консоли я могу перечислить все параметры метода через пробел:

java Hello.java Борис
Добро пожаловать, Борис!

Использование других классов

Я могу использовать не только методы из текущего файла, но и соседние классы, если они лежат в той же папке src.

// файл src/Person.java
record Person(
        String name,
        int age
) {
}

// файл src/Hello.java
void main() {
    var person = new Person("Анна", 25);
    IO.println("Добро пожаловать, " + person.name() + "!");
}

Никаких импортов.

Доступность стандартной библиотеки

Вводом-выводом дело не ограничивается. В скоупе Compact Source мне также доступны все стандартные классы и коллекции (List, Set, Map) без явного импорта.

void main() {
    var persons = List.of(
            new Person("Анна", 23),
            new Person("Фёдор", 34),
            new Person("Николай", 27)
    );
    var average = persons.stream()
            .mapToInt(Person::age)
            .average();
    IO.println("Средний возраст: " + average); // 28
}

Выводы

Разработчики Java уже давно взяли курс на сокращение boiler plate кода, последовательно вводя лямбды, стримы, var, List.of(), record и т.п.

Кульминацией этого движения теперь становятся Compact Source файлы, которые значительно упрощают демонстрацию примеров и написание скриптов. Пожалуй, я и сам буду теперь активно этим пользоваться.

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

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

30 января 2025

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

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

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

27 января 2025

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

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

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

23 января 2025

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

Spring позволяет проверять формат данных в бинах в декларативном стиле при помощи специальных аннотаций из пакета javax.validation. Если мы нарушим хотя бы одно условие, то в ответ получим json с детальным описанием ошибки. Статус ответа будет не 200, а 400 (Bad Request).
Читать полностью...

❮ Назад Далее ❯