Тэги: Java.
Java 25 принесла нам такие фичи как Compact Sources и Instance Main Methods (JEP 512). Теперь мы можем писать на Java как на скриптовом языке: без создания классов, без модификаторов доступа и без явных импортов. Это значительно снижает порог входа для новичков, ведь раньше нужно было объяснять что такое класс, что такое public, static, маccив строк.
Сравните, как выглядела самая простая программа до Java 25:
И как выглядит её эквивалент теперь:
Теперь фиктивная обёртка в виде класса становится необязательной, а System.out получил компактный алиас в виде IO.
На уровне компилятора тут никакой магии нет. Наши методы всё так же оборачиваются в некий класс. При этом имя такого класса удаляется из таблицы символов, чтобы нельзя было его создать с помощью new. То есть для программиста такой класс-обёртка недоступен.
Также необходимо дополнить, что сейчас не обязательно компилировать программу с помощью javac. Мы можем запускать исходники прямо из командной строки. Эта возможность появилась уже довольно давно, ещё в Java 10.
Отсюда кстати следует интересный вывод, что для запуска скрипта на java вам даже не нужен JDK со средствами компиляции, достаточно JRE.
Для упрощения работы с консолью у нас появился новый класс IO, который оборачивает некоторые методы из System.out и System.in. Он содержит всего пять методов:
Наверняка вы помните, что считать строку из консоли в Java было чуть сложнее, чем вывести её на экран. Теперь всё это в прошлом.
Поскольку класс IO находится в пакете java.lang, то импортировать его в явном виде не требуется. Однако Compact Source файл должен находится в корневом пакете (т.е. в папке src). Это позволяет нам избавиться от объявления package.
Теперь давайте рассмотрим несколько примеров.
Допустим, я сначала хочу запросить имя у пользователя, чтобы затем его поприветствовать:
Ничто не мешает мне создавать другие методы в этом же файле:
Как и раньше, я могу передать параметры из командной строки как параметры метода main:
Тогда при вызове программы из консоли я могу перечислить все параметры метода через пробел:
Я могу использовать не только методы из текущего файла, но и соседние классы, если они лежат в той же папке src.
Никаких импортов.
Вводом-выводом дело не ограничивается. В скоупе Compact Source мне также доступны все стандартные классы и коллекции (List, Set, Map) без явного импорта.
Разработчики Java уже давно взяли курс на сокращение boiler plate кода, последовательно вводя лямбды, стримы, var, List.of(), record и т.п.
Кульминацией этого движения теперь становятся Compact Source файлы, которые значительно упрощают демонстрацию примеров и написание скриптов. Пожалуй, я и сам буду теперь активно этим пользоваться.
Тэги: Java, Stream API, ООП.
В основе Stream API, которое значительно упрощает работу с коллекциями в Java, лежит понятие функциональных интерфейсов.
Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией @FunctionalInterface.
Контрольная сумма от набора байт позволяет убедиться в том, что данные на клиенте, полученные от сервера, являются корректными. Для этого вместе с файлом сервер может предоставлять контрольную сумму для проверки на клиентской стороне. Существует несколько алгоритмов вычисления контрольной суммы, рассмотрим самые популярные: md5, sha-256, sha-512 и crc-32.
В пакете java.security есть такой класс как MessageDigest. Он позволяет получить одну из встроенных реализаций алгоритма вычисления контрольных сумм. Поэтому сначала реализуем метод, который абстрагирован от конкретного алгоритма и работает с любым MessageDigest одинаково.
Тэги: алгоритмы, Java, Collections.
На собеседованиях и на leetcode можно встретить такую алгоритмическую задачу. Дан неупорядоченный массив целых чисел. Нужно найти все пары чисел, сумма которых равна указанной. Числа в массиве могут быть как положительными, так и отрицательными. В качестве результата нужно вернуть порядковые индексы найденных элементов.
Например, если дан массив [2, 7, 11, 15] и целевая сумма равна 9, то правильным ответом будут индексы 0 и 1 (то есть первый и второй элементы массива), т.к. 2 + 7 = 9.
Рассмотрим несколько вариантов реализации этого алгоритма.
Тэги: Java, Spring, json, maven, rest.
Spring позволяет проверять входящие запросы в декларативном стиле при помощи специальных аннотаций из пакета jakarta.validation.
Создадим простой проект на Java и добавим в pom.xml следующие зависимости:
Компонент spring-boot-starter-web добавляет базовый функционал по работе с rest-контроллерами, а spring-boot-starter-validation – сам механизм валидации.
Теперь создадим rest-контроллер для работы с пользователями. В нём есть метод, создающий нового пользователя. Согласно restful-соглашениям, это будет POST-запрос:
На вход метод принимает CreateUserRequest, который мы будем передавать в формате json. Этот параметр метода снабжён аннотациями @RequestBody (говорит, что параметры будут именно в теле запроса) и @Valid (аннотация, которая активирует механизм валидации для данного бина). Если не указать аннотацию @Valid, то валидация работать не будет!
Тэги: Spring Boot, maven, Java, rest.
Spring Boot поддерживает простой механизм кеширования данных. Рассмотрим его на примере, исходники которого доступны на github.
Создадим стандартное приложение Spring Boot. Это удобно делать через Spring Initializr.
Добавим в pom.xml две зависимости:
Зависимость spring-boot-starter-web – это базовая функциональность нашего веб-приложения, в том числе поддержка rest-контроллеров. Зависимость spring-boot-starter-cache добавляет возможность кеширования.
Тэги: алгоритмы, Java, головоломки, Kotlin.
На собеседованиях по алгоритмам любят давать такую задачку, как нахождение чисел из последовательности Фибоначчи. Эта числовая последовательность названа в честь Леонардо Пизанского – известного математика Средневековья.
Сама последовательность довольно проста. Она состоит из целых положительных чисел, где каждый следующий элемент равен сумме двух предыдущих. Например, 2 = 1 + 1, 3 = 2 + 1, 5 = 3 + 2.
Последовательность начинается с 0 и 1:
Иногда в этой последовательности принято пропускать 0 и начинать её с двух единиц, однако официально она начинается именно с 0.
Тэги: Spring, руководство, Java, gradle, maven, PostgreSQL, SQL, Nginx, Linux, devops.
Если Вам интересно, как настроить сервер для хостинга JVM приложения, то предлагаю вашему вниманию следующую инструкцию. Предположим, вы только что получили доступ к чистому VPS серверу, на котором крутится Ubuntu и вы хотите на нём развернуть полноценное JVM приложение, основанное на Spring. Для полноты картины мы настроим также локальный postgres и доступ извне по http.
Прежде всего обновляем индекс менеджера пакетов apt. У вас должно быть достаточно прав для выполнения sudo, а также ваш сервер должен иметь доступ в Интернет.
Тэги: Java, Collections, ООП.
Интерфейсы Comparable и Comparator, как и Iterable и Iterator (см. Перебор элементов через Iterator), являются частью Java Collections. Подобно тому, как Iterable наделяет объекты свойством перебора в цикле, так и Comparable («сравниваемый») наделяет объекты свойством сравнимости между собой.
Данный интерфейс предоставляет универсальный способ сравнивать два объекта между собой. Его контракт состоит из единственного метода compareTo():
Метод сравнивает текущий объект this с другим объектом того же типа other, который передали в параметре. В качестве результата метод возвращает целое число. Этот результат определяется контрактом данного метода и должен принимать одно из следующих значений:
Рассмотрим случай, когда у вас есть некое число, количество цифр в котором заранее неизвестно и вам необходимо, чтобы число всегда составляло 5 знаков, то есть нужно добавить необходимое количество нулей слева. Есть целых два способа сделать это.
Если у вас небольшой проект и не хочется тянуть лишнюю зависимость, то используйте String.format():
В результате мы увидим строку «00042». К недостаткам данного способа можно отнести то, что нужно помнить правила форматирования в методе String.format().
Kotlin, Java, Spring, Spring Boot, Spring Data, Spring AI, SQL, PostgreSQL, Oracle, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.