Тэги: Collections, Stream API, Java.
Ранее мы уже рассмотрели Промежуточные операции Stream API, а сейчас рассмотрим терминальные (конечные).
Промежуточные операции следует воспринимать как «отложенные», т.е. они не меняют сами данные, а только задают правила их изменения. А терминальные как раз инициируют всю цепочку преобразований, закрывают поток и возвращают модифицированные данные. Закрытый поток повторно использовать нельзя.
Самая распространённая терминальная операция collect(). Результатом может быть, например, список.
А можно преобразовать стрим из строк в мапу, причём ключом сделать первую букву соответствующего слова:
Тэги: Stream API, Collections, Java.
Все методы Stream API можно разделить на две группы: промежуточные и терминальные (конечные). Промежуточные операции следует воспринимать как «отложенные», т.е. они не меняют сами данные, а только задают правила их изменения. А терминальные как раз инициируют всю цепочку преобразований и возвращают модифицированные данные.
Рассмотрим промежуточные операции. Все промежуточные операции возвращают типизированный интерфейс Stream<>.
Любое изменение исходного элемента можно делать с помощью метода map(). В качестве параметра метод принимает лямбда-выражение.
Во втором случае мы воспользовались краткой записью лямбда-выражения через method reference.
Тэги: Java, Stream API, ООП.
В основе Stream API, которое значительно упрощает работу с коллекциями в Java, лежит понятие функциональных интерфейсов.
Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией @FunctionalInterface.
Тэги: 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 файлы, которые значительно упрощают демонстрацию примеров и написание скриптов. Пожалуй, я и сам буду теперь активно этим пользоваться.
Контрольная сумма от набора байт позволяет убедиться в том, что данные на клиенте, полученные от сервера, являются корректными. Для этого вместе с файлом сервер может предоставлять контрольную сумму для проверки на клиентской стороне. Существует несколько алгоритмов вычисления контрольной суммы, рассмотрим самые популярные: 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, а также ваш сервер должен иметь доступ в Интернет.
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.