На днях написал заметку про Функциональные интерфейсы в Java.
Многие методы Stream API в качестве параметров принимают именно функциональные интерфейсы.
Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией
В статье мы рассмотрим наиболее употребимые функциональные интерфейсы стандартной библиотеки. Все эти интерфейсы можно найти в пакете java.util.function.
Многие методы Stream API в качестве параметров принимают именно функциональные интерфейсы.
Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией
@FunctionalInterface. Реализацию любого функционального интерфейса можно записать кратко в виде лямбды.В статье мы рассмотрим наиболее употребимые функциональные интерфейсы стандартной библиотеки. Все эти интерфейсы можно найти в пакете java.util.function.
👍13
Обновил 📺 видео к статье про создание Telegram-бота на Spring и Kotlin.
В настоящее время чат-боты в Telegram не делал только ленивый. Они плотно вошли в нашу жизнь и почти у каждой компании есть бот, решающий какие-то задачи бизнеса, тем самым разгружая «живых» сотрудников.
Видео доступно на YouTube и RuTube.
В пример на github я добавил Dockerfile и теперь его легко можно запустить в любом облачном сервисе. Например, на dockhost.ru.
В настоящее время чат-боты в Telegram не делал только ленивый. Они плотно вошли в нашу жизнь и почти у каждой компании есть бот, решающий какие-то задачи бизнеса, тем самым разгружая «живых» сотрудников.
Видео доступно на YouTube и RuTube.
В пример на github я добавил Dockerfile и теперь его легко можно запустить в любом облачном сервисе. Например, на dockhost.ru.
👍8🔥1
Обновил статью Inline-кнопки в telegram-боте и записал видео к ней.
Предположим, вы решили написать онлайн-квиз в виде Telegram-бота. Бот должен выдать вопрос и какие-то варианты ответа к нему.
Если это делать с помощью обычных кнопок, то довольно сложно сопоставить ответ пользователя с конкретным вопросом, т.к. обычные кнопки не хранят контекст.
Но есть встраиваемые (inline) кнопки, которые относятся непосредственно к сообщению. Они добавляют гораздо больше интерактива и именно их можно увидеть при регистрации бота в @BotFather.
📺 Видео доступно на YouTube и RuTube.
Предположим, вы решили написать онлайн-квиз в виде Telegram-бота. Бот должен выдать вопрос и какие-то варианты ответа к нему.
Если это делать с помощью обычных кнопок, то довольно сложно сопоставить ответ пользователя с конкретным вопросом, т.к. обычные кнопки не хранят контекст.
Но есть встраиваемые (inline) кнопки, которые относятся непосредственно к сообщению. Они добавляют гораздо больше интерактива и именно их можно увидеть при регистрации бота в @BotFather.
📺 Видео доступно на YouTube и RuTube.
👍4🔥1
Недавно я опубликовал статью Как быстро развернуть Spring Boot в облаке, а теперь записал видеогайд по ней.
Наличие Dockerfile позволяет выполнять деплой docker-контейнеров на разных хостингах независимо от технологий виртуализации, которые используются у этого хостера. Но мне, как программисту, хотелось бы развернуть проект прямо из репозитория, подобно тому, как это делается в heroku.
Эта технология называется Push-To-Deploy и она поддерживается в облачном сервисе dockhost. Вам достаточно запушить изменения в репозиторий, и всё остальное платформа сделает за вас: выполнит сборку проекта, создаст контейнер и подставит переменные окружения. При необходимости также можно привязать свой домен или сгенерить бесплатный. Https-сертификат при этом будет выпущен автоматически.
📺 Видео доступно на YouTube и RuTube.
Наличие Dockerfile позволяет выполнять деплой docker-контейнеров на разных хостингах независимо от технологий виртуализации, которые используются у этого хостера. Но мне, как программисту, хотелось бы развернуть проект прямо из репозитория, подобно тому, как это делается в heroku.
Эта технология называется Push-To-Deploy и она поддерживается в облачном сервисе dockhost. Вам достаточно запушить изменения в репозиторий, и всё остальное платформа сделает за вас: выполнит сборку проекта, создаст контейнер и подставит переменные окружения. При необходимости также можно привязать свой домен или сгенерить бесплатный. Https-сертификат при этом будет выпущен автоматически.
📺 Видео доступно на YouTube и RuTube.
🔥4👍3
Сегодня, 18 марта 2025 года, вышла новая версия Java 24!
✅ Новые фичи:
Stream Gatherers - это расширение Stream API, которое позволяет создавать собственные промежуточные (intermediate) операции. До этого можно было использовать только стандартные промежуточные операции вроде
Class-File API - это стандартное API для парсинга, генерации и трансформации class-файлов, которое впервые появилось в Java 22, теперь окончательно оформилось в Java 24. Фреймворки и инструменты, использующие стандартный API, будут автоматически поддерживать class-файлы из последней версии JDK, что позволит быстро и легко внедрять новые возможности языка и VM, представленные в class-файлах. До этого обновление сторонних библиотек для работы с class-файлами происходило с заметной задержкой относительно релиза каждой новой JDK.
✅ Фичи в статусе превью (работают только с флагом
Generational Shenandoah GC - режим поколений для сборщика мусора Shenandoah. Изначально Shenandoah был non-generational сборщиком, то есть он не разделял объекты на молодое и старое поколения, как это делают G1, Parallel и, начиная с JDK 23, ZGC. Благодаря новому режиму Shenandoah сможет поддерживать молодое и старое поколения, что позволит чаще собирать молодые объекты.
Project Lilliput привносит компактные заголовки объектов. Цель проекта — уменьшить размер заголовков Java-объектов в HotSpot JVM с 96 или 128 бит до 64 бит на 64-битных архитектурах (x64 и AArch64). Это призвано уменьшить использование CPU и/или памяти Java-приложениями.
✅ Очередные итерации предварительных версий:
Поддержка примитивных типов в конструкциях
Vector API повышает производительность расчётов на массивах однотипных данных. Это особенно актуально для машинного обучения, линейной алгебры, криптографии и финансов.
Simple Source Files, который позволяет писать программы вида "Hello, world!" в упрощённом варианте: без явного определения класса, без импортов и в не-статическом main-методе без параметров. Это приближает Java по синтаксису к скриптовым языкам.
Flexible Constructor Bodies - в конструкторе класса можно выполнять некоторую логику перед вызовом
Импорт модулей как альтернатива импорту пакетов.
Я перечислил только основные изменения. На самом деле их больше.
Будете ли вы переходить на Java 24 или дождётесь Java 25, версии с длительной поддержкой, выход которой запланирован на сентябрь?
✅ Новые фичи:
Stream Gatherers - это расширение Stream API, которое позволяет создавать собственные промежуточные (intermediate) операции. До этого можно было использовать только стандартные промежуточные операции вроде
filter(), map(), distinct() и т.п.Class-File API - это стандартное API для парсинга, генерации и трансформации class-файлов, которое впервые появилось в Java 22, теперь окончательно оформилось в Java 24. Фреймворки и инструменты, использующие стандартный API, будут автоматически поддерживать class-файлы из последней версии JDK, что позволит быстро и легко внедрять новые возможности языка и VM, представленные в class-файлах. До этого обновление сторонних библиотек для работы с class-файлами происходило с заметной задержкой относительно релиза каждой новой JDK.
✅ Фичи в статусе превью (работают только с флагом
--enable-preview):Generational Shenandoah GC - режим поколений для сборщика мусора Shenandoah. Изначально Shenandoah был non-generational сборщиком, то есть он не разделял объекты на молодое и старое поколения, как это делают G1, Parallel и, начиная с JDK 23, ZGC. Благодаря новому режиму Shenandoah сможет поддерживать молодое и старое поколения, что позволит чаще собирать молодые объекты.
Project Lilliput привносит компактные заголовки объектов. Цель проекта — уменьшить размер заголовков Java-объектов в HotSpot JVM с 96 или 128 бит до 64 бит на 64-битных архитектурах (x64 и AArch64). Это призвано уменьшить использование CPU и/или памяти Java-приложениями.
✅ Очередные итерации предварительных версий:
Поддержка примитивных типов в конструкциях
pattern matching, switch и instanceof. То есть когда во время проверки условия компилятор автоматически выводит тип данных. Ранее это было доступно для ссылочных типов и record-классов.Vector API повышает производительность расчётов на массивах однотипных данных. Это особенно актуально для машинного обучения, линейной алгебры, криптографии и финансов.
Simple Source Files, который позволяет писать программы вида "Hello, world!" в упрощённом варианте: без явного определения класса, без импортов и в не-статическом main-методе без параметров. Это приближает Java по синтаксису к скриптовым языкам.
Flexible Constructor Bodies - в конструкторе класса можно выполнять некоторую логику перед вызовом
super(), если она не использует текущее состояние объекта.Импорт модулей как альтернатива импорту пакетов.
Я перечислил только основные изменения. На самом деле их больше.
Будете ли вы переходить на Java 24 или дождётесь Java 25, версии с длительной поддержкой, выход которой запланирован на сентябрь?
👍6🔥3
Представьте, что в один прекрасный день к вам пришёл заказчик и говорит: "в рамках импортозамещения мы должны отказаться от Jira и вместо неё разработать собственный инструмент для управления задачами". Конкретно вам поручено разработать небольшой сервис. Этот сервис оперирует статусами задач и подзадач, которые в неё входят.
Мы должны принять важное архитектурное решение. Можно конечно при смене статусов сабтасок ещё и обрабатывать статусы родительских тасок. И если они меняются, тут же ещё и встраивать логику по отправке email. Но это делает логику не расширяемой и сложной в поддержке. Если завтра появится ещё несколько статусов, мы получим спагетти-код.
Чтобы этого избежать, лучше сразу сделать компоненты системы менее связанными и обеспечить их взаимодействие через события. То есть если меняется статус сабтаски - мы генерим соответствующий эвент. Далее компонент обработки статуса получает это событие, выполняет проверку остальных сабтасок и при необходимости меняет статус родительской задачи.
При построении event-driven системы можно использовать разные брокеры сообщений, но мы рассмотрим наиболее популярный из них - RabbitMQ.
В тестовых целях "кролика" можно развернуть в один клик на платформе dockhost.ru
Подробности читайте на Хабре в моей новой статье RabbitMQ и Kotlin: делаем свою event-driven Jira на Spring.
Мы должны принять важное архитектурное решение. Можно конечно при смене статусов сабтасок ещё и обрабатывать статусы родительских тасок. И если они меняются, тут же ещё и встраивать логику по отправке email. Но это делает логику не расширяемой и сложной в поддержке. Если завтра появится ещё несколько статусов, мы получим спагетти-код.
Чтобы этого избежать, лучше сразу сделать компоненты системы менее связанными и обеспечить их взаимодействие через события. То есть если меняется статус сабтаски - мы генерим соответствующий эвент. Далее компонент обработки статуса получает это событие, выполняет проверку остальных сабтасок и при необходимости меняет статус родительской задачи.
При построении event-driven системы можно использовать разные брокеры сообщений, но мы рассмотрим наиболее популярный из них - RabbitMQ.
В тестовых целях "кролика" можно развернуть в один клик на платформе dockhost.ru
Подробности читайте на Хабре в моей новой статье RabbitMQ и Kotlin: делаем свою event-driven Jira на Spring.
👍5🔥2
В сообществе Spring АйО на Хабре вышла интересная статья Spring Boot 3.3 и Docker: изменение в эффективных docker-образах.
Если вы не знали, Spring уже несколько лет "из коробки" поддерживает разделение одного jar-файла на "слои":
dependencies — внешние зависимости
spring-boot-loader — загрузчик Spring Boot
snapshot-dependencies — зависимости snapshot-версий
application — код приложения
Это позволяет оптимизировать работу с Docker-образами, т.к. чаще всего мы делаем изменения именно в последнем слое, который содержит бизнес-логику.
Так вот, в Spring Boot 3.3 изменилась команда распаковки запуска приложения в "многослойном режиме". Разработчики постарались стандартизовать эти команды. Более подробно читайте в статье.
Если вы не знали, Spring уже несколько лет "из коробки" поддерживает разделение одного jar-файла на "слои":
dependencies — внешние зависимости
spring-boot-loader — загрузчик Spring Boot
snapshot-dependencies — зависимости snapshot-версий
application — код приложения
Это позволяет оптимизировать работу с Docker-образами, т.к. чаще всего мы делаем изменения именно в последнем слое, который содержит бизнес-логику.
Так вот, в Spring Boot 3.3 изменилась команда распаковки запуска приложения в "многослойном режиме". Разработчики постарались стандартизовать эти команды. Более подробно читайте в статье.
Хабр
Spring Boot 3.3 и Docker: изменение в эффективных docker-образах
Переход от Spring Boot 3.2 к 3.3 принес изменения в процесс распаковки JAR и запуск приложения в Docker-контейнере. В новой статье от Рустама Курамшина, эксперта сообщества Spring АйО , вы узнаете: •...
👍7🔥3
Опубликовал на Хабре статью Стандартизация без боли: как строгий синтаксис экономит время и нервы.
В этой статье я сравню несколько популярных языков программирования с точки зрения их синтаксической однозначности, гибкости и способности масштабироваться в командной разработке. Мы посмотрим, как строгие ограничения формируют культуру качества, а чрезмерная выразительность часто мешает команде работать как единое целое.
Ставьте лайки и пишите в комментах, с чем согласны или не согласны)
В этой статье я сравню несколько популярных языков программирования с точки зрения их синтаксической однозначности, гибкости и способности масштабироваться в командной разработке. Мы посмотрим, как строгие ограничения формируют культуру качества, а чрезмерная выразительность часто мешает команде работать как единое целое.
Ставьте лайки и пишите в комментах, с чем согласны или не согласны)
👍6
▶️ Spring AI: пишем telegram-bot для ChatGPT ◀️
Поскольку Spring AI развивается семимильными шагами, относительно недавно появилась её первая стабильная версия 1.0. Эта версия довольно сильно отличается от той, которая была в статусе превью: одни абстракции были добавлены, другие были удалены. Поменялось даже название самого стартера!
В связи с этим статья, которую я публиковал в марте, уже становится неактуальной. Дабы поделиться с вами своими последними наработками, я расширил и актуализировал статью про основы интеграции Spring AI.
Поскольку Spring AI развивается семимильными шагами, относительно недавно появилась её первая стабильная версия 1.0. Эта версия довольно сильно отличается от той, которая была в статусе превью: одни абстракции были добавлены, другие были удалены. Поменялось даже название самого стартера!
В связи с этим статья, которую я публиковал в марте, уже становится неактуальной. Дабы поделиться с вами своими последними наработками, я расширил и актуализировал статью про основы интеграции Spring AI.
👍9⚡2
Новая статья по Spring AI!
▶️ Spring AI: retrieval augmented generation ◀️
Spring AI, который только недавно получил первую стабильную версию, уже предоставляет довольно много возможностей для работы с RAG (retrieval augmented generation).
Благодаря этому подходу нейросеть перед тем, как дать ответ на запрос пользователя, выполнит поиск подходящей информации в векторном хранилище. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»).
Процесс преобразования различных документов в такой векторный формат выполняется опять же с помощью LLM и называется embedding («встраивание»). Хорошая новость заключается в том, что всё это можно легко сделать с помощью Spring AI.
В статье я привожу пример, как можно распарсить несколько Excel-файлов, чтобы извлечь из них историю изменения курса доллара. Эту информацию мы преобразуем в эмбеддинги и сохраняем в векторном хранилище pgVector. Затем эмбеддинги можно подгружать в контекст LLM для выполнения различных аналитических запросов в диалогом режиме.
P.S. Эту же статью я опубликовал на Хабре. Жду ваших комментариев!
▶️ Spring AI: retrieval augmented generation ◀️
Spring AI, который только недавно получил первую стабильную версию, уже предоставляет довольно много возможностей для работы с RAG (retrieval augmented generation).
Благодаря этому подходу нейросеть перед тем, как дать ответ на запрос пользователя, выполнит поиск подходящей информации в векторном хранилище. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»).
Процесс преобразования различных документов в такой векторный формат выполняется опять же с помощью LLM и называется embedding («встраивание»). Хорошая новость заключается в том, что всё это можно легко сделать с помощью Spring AI.
В статье я привожу пример, как можно распарсить несколько Excel-файлов, чтобы извлечь из них историю изменения курса доллара. Эту информацию мы преобразуем в эмбеддинги и сохраняем в векторном хранилище pgVector. Затем эмбеддинги можно подгружать в контекст LLM для выполнения различных аналитических запросов в диалогом режиме.
P.S. Эту же статью я опубликовал на Хабре. Жду ваших комментариев!
👍7🔥3
Продолжаем цикл статей по Spring AI!
▶️ Spring AI: model context protocol ◀️
Протокол контекста модели (Model Context Protocol, MCP) — это открытый стандарт, разработанный и представленный компанией Anthropic 25 ноября 2024 года. Основная цель MCP — создание унифицированного протокола взаимодействия между большими языковыми моделями (LLM) и внешними источниками данных и инструментами. MCP унифицирует определения вызовов интерфейса для доступа к возможностям различных инструментов.
Архитектура с использованием MCP состоит из MCP-клиента, который обращается к одному или нескольким MCP-серверам. Эти сервера интегрированы с целевыми инструментами и источниками данных.
Spring AI позволяет выполнить эту интеграцию в простом декларативном стиле. Вам даже не потребуется разбираться с протоколом, т.к. Spring будет генерить описания инструментов автоматически.
P.S. Эту же статью я опубликовал на Хабре - жду ваших комментов!
▶️ Spring AI: model context protocol ◀️
Протокол контекста модели (Model Context Protocol, MCP) — это открытый стандарт, разработанный и представленный компанией Anthropic 25 ноября 2024 года. Основная цель MCP — создание унифицированного протокола взаимодействия между большими языковыми моделями (LLM) и внешними источниками данных и инструментами. MCP унифицирует определения вызовов интерфейса для доступа к возможностям различных инструментов.
Архитектура с использованием MCP состоит из MCP-клиента, который обращается к одному или нескольким MCP-серверам. Эти сервера интегрированы с целевыми инструментами и источниками данных.
Spring AI позволяет выполнить эту интеграцию в простом декларативном стиле. Вам даже не потребуется разбираться с протоколом, т.к. Spring будет генерить описания инструментов автоматически.
P.S. Эту же статью я опубликовал на Хабре - жду ваших комментов!
🔥3👍2
Ехал я недавно на Сапсане и решил скоротать время за прослушиванием какого-нибудь подкаста. Под руку попался подкаст "Бреслав и Ложечкин" под названием Vibe Coding.
В этом подкасте ребята рассуждают про то, как изменится написание кода в ближайшем будущем с использованием LLM. Андрей Бреслав, известный как создатель языка Kotlin, анонсировал свой новый проект под названием CodeSpeak. (Вот ведь совпадение, учитывая, что ехал я в Питер, где находится остров Котлин).
Похоже, Андрей решил повторить свой успех и сделать новый инструмент для разработчиков. Он утверждает, что современные LLM вполне в состоянии писать хороший код, но они не могут залезть к вам в голову, чтобы понять, что именно вы от неё хотите. Требуется правильно написать спецификацию, в которой изложить все бизнес-требования (по сути большой промт). При этом LLM не требуется объяснять стандартные вещи вроде того, как подключаться к БД или настраивать мониторинг.
Такой инструмент позволит писать спецификации практически на естественном английском языке (хотя почему только на английском?). Если же он обнаружит, что какой-то термин может быть истолкован двояко, то тут же запросит у вас уточнение. Совсем как реальный человек, которому вы отдаёте разработку на аутсорс.
Другой момент, который подсвечивает Андрей (и я с ним полностью согласен), что диалоговый режим в виде чата не очень подходит для написания кода. CodeSpeak не пытается каждый раз заново писать весь код целиком, а вносит инкрементальные изменения и сохраняет общую структуру.
Ну и наверное самый интересный поинт, что в ближайшем будущем уже не будет иметь значения на чём написана программа: на Java, Python или javascript. Обладая спецификацией на естественном языке, система сможет написать реализацию на любом из них. Возможно, разработчики ближайшего будущего даже не будут задумываться, на каком языке будет генериться код. Ведь сами языки программирования были придуманы для того, что в конечном счёте получать готовый исполняемый файл, понятный машине.
P.S. Используете ли вы AI-инструменты для генерации кода? И если да, то в каком режиме: умный автокомплит в текущем контексте или генерация готовых методов и классов целиком?
В этом подкасте ребята рассуждают про то, как изменится написание кода в ближайшем будущем с использованием LLM. Андрей Бреслав, известный как создатель языка Kotlin, анонсировал свой новый проект под названием CodeSpeak. (Вот ведь совпадение, учитывая, что ехал я в Питер, где находится остров Котлин).
Похоже, Андрей решил повторить свой успех и сделать новый инструмент для разработчиков. Он утверждает, что современные LLM вполне в состоянии писать хороший код, но они не могут залезть к вам в голову, чтобы понять, что именно вы от неё хотите. Требуется правильно написать спецификацию, в которой изложить все бизнес-требования (по сути большой промт). При этом LLM не требуется объяснять стандартные вещи вроде того, как подключаться к БД или настраивать мониторинг.
Такой инструмент позволит писать спецификации практически на естественном английском языке (хотя почему только на английском?). Если же он обнаружит, что какой-то термин может быть истолкован двояко, то тут же запросит у вас уточнение. Совсем как реальный человек, которому вы отдаёте разработку на аутсорс.
Другой момент, который подсвечивает Андрей (и я с ним полностью согласен), что диалоговый режим в виде чата не очень подходит для написания кода. CodeSpeak не пытается каждый раз заново писать весь код целиком, а вносит инкрементальные изменения и сохраняет общую структуру.
Ну и наверное самый интересный поинт, что в ближайшем будущем уже не будет иметь значения на чём написана программа: на Java, Python или javascript. Обладая спецификацией на естественном языке, система сможет написать реализацию на любом из них. Возможно, разработчики ближайшего будущего даже не будут задумываться, на каком языке будет генериться код. Ведь сами языки программирования были придуманы для того, что в конечном счёте получать готовый исполняемый файл, понятный машине.
P.S. Используете ли вы AI-инструменты для генерации кода? И если да, то в каком режиме: умный автокомплит в текущем контексте или генерация готовых методов и классов целиком?
👍6
Нейросети отберут у вас львиную долю написания кода. Но это неплохо. И вот почему.
Попробовал я тут на днях Codex от OpenAI. Его релиз состоялся 16 мая 2025 года, т.е. два месяца назад. И возможно ещё не все успели его попробовать.
Это AI-агент, который подключается к вашему репозиторию (пока поддерживается только github) и подготавливает пулл реквест согласно той задаче, которую вы ему поставите в текстовом виде. Работает он в собственном окружении ("на своей виртуалке") и вы можете видеть в режиме реального времени, как он выкачивает проект и сканирует его посредством консольных команд.
После этого вы видите дифф изменений как в гите и можете проводить ревью. Вы можете либо уточнить задачу целиком, либо попросить поправить конкретные места. Если комменты есть - отправляем на вторую итерацию. Если всё ок - мержим в мастер.
О том, какой опыт я получил при использовании Codex и какие выводы сделал, читайте в моей новой статье на Хабре:
▶️ Как AI-агенты помогут достроить вашу Вавилонскую Башню
Попробовал я тут на днях Codex от OpenAI. Его релиз состоялся 16 мая 2025 года, т.е. два месяца назад. И возможно ещё не все успели его попробовать.
Это AI-агент, который подключается к вашему репозиторию (пока поддерживается только github) и подготавливает пулл реквест согласно той задаче, которую вы ему поставите в текстовом виде. Работает он в собственном окружении ("на своей виртуалке") и вы можете видеть в режиме реального времени, как он выкачивает проект и сканирует его посредством консольных команд.
После этого вы видите дифф изменений как в гите и можете проводить ревью. Вы можете либо уточнить задачу целиком, либо попросить поправить конкретные места. Если комменты есть - отправляем на вторую итерацию. Если всё ок - мержим в мастер.
О том, какой опыт я получил при использовании Codex и какие выводы сделал, читайте в моей новой статье на Хабре:
▶️ Как AI-агенты помогут достроить вашу Вавилонскую Башню
👍6❤3🔥2
🎉 Сегодня — День рождения Kotlin! 🎂
22 июля 2011 года на JVM Language Summit в Сан-Франциско компания JetBrains официально представила свою новую статически типизированную JVM-языковую платформу под названием Kotlin. Вот уже 14 лет он помогает разработчикам писать код проще, безопаснее и приятнее.
🔹 Разработка началась в 2010 году под руководством Андрея Бреслава.
🔹 22 июля 2011 года — официальное анонсирование Kotlin как нового JVM-языка.
🔹 Февраль 2012 — проект становится открытым исходным кодом под лицензией Apache 2.0.
🔹 15 февраля 2016 года вышла версия 1.0 — первая стабильная версия.
🔹 Май 2017 — Google объявил о поддержке Kotlin как одного из основных языков для Android.
🔹 2019 — Google официально признал Kotlin предпочтительным языком для Android.
С тех пор Kotlin активно развивается: появились Kotlin/Native, Kotlin/JS, мультиплатформенные возможности и новые стабильные версии до Kotlin 2.0 (май 2024).
✨ Присоединяйтесь к празднованию: расскажите в комментариях, когда вы впервые познакомились с Kotlin и что вам в нём нравится больше всего!
22 июля 2011 года на JVM Language Summit в Сан-Франциско компания JetBrains официально представила свою новую статически типизированную JVM-языковую платформу под названием Kotlin. Вот уже 14 лет он помогает разработчикам писать код проще, безопаснее и приятнее.
🔹 Разработка началась в 2010 году под руководством Андрея Бреслава.
🔹 22 июля 2011 года — официальное анонсирование Kotlin как нового JVM-языка.
🔹 Февраль 2012 — проект становится открытым исходным кодом под лицензией Apache 2.0.
🔹 15 февраля 2016 года вышла версия 1.0 — первая стабильная версия.
🔹 Май 2017 — Google объявил о поддержке Kotlin как одного из основных языков для Android.
🔹 2019 — Google официально признал Kotlin предпочтительным языком для Android.
С тех пор Kotlin активно развивается: появились Kotlin/Native, Kotlin/JS, мультиплатформенные возможности и новые стабильные версии до Kotlin 2.0 (май 2024).
✨ Присоединяйтесь к празднованию: расскажите в комментариях, когда вы впервые познакомились с Kotlin и что вам в нём нравится больше всего!
🎉6🔥3👍2
Лето подходит к концу, а вместе с ним и сезон отпусков. Но не стоит расстраиваться. Во-первых, впереди ещё бархатный сезон, а во-вторых, предстоящая осень обещает быть богатой на события в мире Java, Kotlin и Spring.
СЕНТЯБРЬ
12 сентября в Москве пройдёт big tech night — «ночь музеев» в мире IT. Целых пять компаний (Яндекс, Сбер, X5, Т-Банк и Lamoda) объединились, чтобы открыть двери своих офисов для тех, кто любит технологии.
16 сентября ожидается публичный релиз Java 25. Несмотря на то, что мажорная версия Java обновляется каждые полгода, эта будет ещё и long-term support. Последняя такая версия выходила два года назад. Поэтому выход LTS - весомый повод, чтобы обновляться.
ОКТЯБРЬ
В Петербурге с 17 по 18 октября пройдёт Joker 2025 - крупнейшая Java-конференция года.
НОЯБРЬ
C 6 по 7 ноября в Москве пройдёт Highload - крупнейшая конференция для разработчиков высоконагруженных приложений (тут не только про Java).
Ещё именно в ноябре ожидается релиз Spring 7 и Spring Boot 4.
Среди многочисленных улучшений в Spring наконец-то завезут механизм версионирования запросов. Такого механизма реально не хватало, потому что он позволяет обеспечивать обратную совместимость.
Также появится новый
Ещё появится
P.S. Это разумеется не все события из мира разработки, которые будут осенью. Вы можете дополнить этот список в комментариях)
СЕНТЯБРЬ
12 сентября в Москве пройдёт big tech night — «ночь музеев» в мире IT. Целых пять компаний (Яндекс, Сбер, X5, Т-Банк и Lamoda) объединились, чтобы открыть двери своих офисов для тех, кто любит технологии.
16 сентября ожидается публичный релиз Java 25. Несмотря на то, что мажорная версия Java обновляется каждые полгода, эта будет ещё и long-term support. Последняя такая версия выходила два года назад. Поэтому выход LTS - весомый повод, чтобы обновляться.
ОКТЯБРЬ
В Петербурге с 17 по 18 октября пройдёт Joker 2025 - крупнейшая Java-конференция года.
НОЯБРЬ
C 6 по 7 ноября в Москве пройдёт Highload - крупнейшая конференция для разработчиков высоконагруженных приложений (тут не только про Java).
Ещё именно в ноябре ожидается релиз Spring 7 и Spring Boot 4.
Среди многочисленных улучшений в Spring наконец-то завезут механизм версионирования запросов. Такого механизма реально не хватало, потому что он позволяет обеспечивать обратную совместимость.
Также появится новый
JmsClient вместо JmsTemplate, а также улучшения в JdbcClient. Вы же больше не используете JdbcTemplate?)Ещё появится
RestTestClient для тестирования REST API. Он ориентирован на создание интеграционных тестов и работу с заглушками.P.S. Это разумеется не все события из мира разработки, которые будут осенью. Вы можете дополнить этот список в комментариях)
🔥5⚡4❤🔥3👍3
Вчера вышла Java 25!
Это версия с долговременной поддержкой, поэтому имеет смысл переходить на неё в ближайшее время. Она привносит следующие изменения:
1) import module — меньше бойлерплейта (JEP 511)
Позволяет подтянуть экспортируемые пакеты модуля одной строкой — удобно для утилит и «скриптового» кода.
2) Compact Source Files and Instance Main Methods (JEP 512)
Можно запускать файл без создания явного класса. Метод
3) Flexible Constructor Bodies (JEP 513)
Flexible Constructor Bodies, которые были в preview три релиза (Java 22, Java 23, Java 24), стали постоянной фичей языка. Теперь можно писать инструкции в конструкторе перед явным вызовом конструктора (
4) Scoped Values (JEP 506)
Класс
5) Компактные заголовки объектов (JEP 519)
Включаются флагом
Конечно же, это далеко не все изменения в Java 25. Всё перечисленное выше - уже production-ready. Помимо этого в статусе очередного preview находятся ещё несколько интересных фич:
6) Примитивы в pattern/instanceof/switch — третий preview (JEP 507)
7) Stable Values — preview (JEP 502) - позволяет создавать неизменяемые поля с отложенной инициализацией
8) PEM-кодирование криптообъектов — preview (JEP 470)
9) Structured Concurrency — пятый preview (JEP 505)
10) Vector API (Tenth Incubator) (JEP 508)
P.S. Мне, как человеку, который делает обучающие материалы по Java, особенно интересные фичи 1 и 2.
А что показалось наиболее интересным вам? Планируете ли переход на Java 25 в ближайшее время? Пишите в комментариях!
Это версия с долговременной поддержкой, поэтому имеет смысл переходить на неё в ближайшее время. Она привносит следующие изменения:
1) import module — меньше бойлерплейта (JEP 511)
Позволяет подтянуть экспортируемые пакеты модуля одной строкой — удобно для утилит и «скриптового» кода.
// List, Map, Path и пр. без отдельных import
import module java.base;
void main() {
var names = List.of("James", "Bill", "Guy");
IO.println(names);
}
2) Compact Source Files and Instance Main Methods (JEP 512)
Можно запускать файл без создания явного класса. Метод
main() теперь не обязательно должен быть static. Мы можем писать код в "скриптовом" стиле, что удобно для начинающих.String msg = "Hello, Java 25!";
void main() {
IO.println(msg);
}
3) Flexible Constructor Bodies (JEP 513)
Flexible Constructor Bodies, которые были в preview три релиза (Java 22, Java 23, Java 24), стали постоянной фичей языка. Теперь можно писать инструкции в конструкторе перед явным вызовом конструктора (
super() или this()):public class PositiveBigInteger extends BigInteger {
public PositiveBigInteger(long value) {
if (value <= 0)
throw new IllegalArgumentException("non-positive value");
super(value);
}
}4) Scoped Values (JEP 506)
Класс
ScopedValue позволяет обмениваться иммутабельными данными без их передачи через аргументы методов. Он является более оптимизированной альтернативой существующему классу ThreadLocal.private static final ScopedValue<FrameworkContext> CONTEXT = ScopedValue.newInstance();
void serve(Request request, Response response) {
var context = createContext(request);
ScopedValue.where(CONTEXT, context)
.run(() -> Application.handle(request, response));
}
public PersistedObject readKey(String key) {
var context = CONTEXT.get();
var db = getDBConnection(context);
db.readKey(key);
}
5) Компактные заголовки объектов (JEP 519)
Включаются флагом
UseCompactObjectHeaders; экономят память и ускоряют сборку мусора.java -XX:+UseCompactObjectHeaders -jar app.jar
Конечно же, это далеко не все изменения в Java 25. Всё перечисленное выше - уже production-ready. Помимо этого в статусе очередного preview находятся ещё несколько интересных фич:
6) Примитивы в pattern/instanceof/switch — третий preview (JEP 507)
7) Stable Values — preview (JEP 502) - позволяет создавать неизменяемые поля с отложенной инициализацией
8) PEM-кодирование криптообъектов — preview (JEP 470)
9) Structured Concurrency — пятый preview (JEP 505)
10) Vector API (Tenth Incubator) (JEP 508)
P.S. Мне, как человеку, который делает обучающие материалы по Java, особенно интересные фичи 1 и 2.
А что показалось наиболее интересным вам? Планируете ли переход на Java 25 в ближайшее время? Пишите в комментариях!
👍5🎉4🔥2💅2⚡1
Почти как javascript
Однако это Java 25! Она принесла нам такие фичи как Compact Sources и Instance Main Methods (JEP 512). Теперь мы можем писать на Java как на скриптовом языке: без создания классов, без модификаторов доступа и без явных импортов.
Это значительно снижает порог входа для новичков, ведь раньше нужно было объяснять что такое класс, что такое public, static, маccив строк. Теперь демонстрировать фрагменты кода и обучать основам Java станет гораздо проще.
А ещё вспомним, что уже довольно давно, со времён Java 10, мы можем запускать исходники на Java без компиляции:
Более подробно читайте в моей новой статье
▶️ Compact Sources в Java ◀️
Однако это Java 25! Она принесла нам такие фичи как Compact Sources и Instance Main Methods (JEP 512). Теперь мы можем писать на Java как на скриптовом языке: без создания классов, без модификаторов доступа и без явных импортов.
Это значительно снижает порог входа для новичков, ведь раньше нужно было объяснять что такое класс, что такое public, static, маccив строк. Теперь демонстрировать фрагменты кода и обучать основам Java станет гораздо проще.
А ещё вспомним, что уже довольно давно, со времён Java 10, мы можем запускать исходники на Java без компиляции:
java Hello.java
Как вас зовут? Борис
Добро пожаловать, Борис!
Более подробно читайте в моей новой статье
▶️ Compact Sources в Java ◀️
🔥6👍5
🎭 Joker 2025 — закончился, но мысли только начались
Как всегда, не просто «послушали доклады», а словили то самое ощущение, за которое и ценишь Java-сообщество:
🧠 куча идей, которые теперь хочется провернуть в своих проектах,
💬 обсуждения в кулуарах, которые дают больше инсайтов, чем слайды,
🔥 и ощущение, что Java — всё ещё про драйв и эволюцию, а не просто «enterprise as usual».
Помимо докладов хочется также отметить:
Стенд Яндекса за не самую тривиальную загадку Эйнштейна.
Стенд ВК за то, что познакомили с игрой Новус (что то вроде бильярда, только с деревянными шайбами).
Стенды Axiom / OpenIDE / Amplicode за то, что предлагаете альтернативный инструментарий для разработчиков.
Как говорится, до встречи в следующем году!
P.S. Axiom анонсировал бесплатный митап JavaRockStars в декабре, поэтому есть возможность увидеться уже довольно скоро.
Как всегда, не просто «послушали доклады», а словили то самое ощущение, за которое и ценишь Java-сообщество:
🧠 куча идей, которые теперь хочется провернуть в своих проектах,
💬 обсуждения в кулуарах, которые дают больше инсайтов, чем слайды,
🔥 и ощущение, что Java — всё ещё про драйв и эволюцию, а не просто «enterprise as usual».
Помимо докладов хочется также отметить:
Стенд Яндекса за не самую тривиальную загадку Эйнштейна.
Стенд ВК за то, что познакомили с игрой Новус (что то вроде бильярда, только с деревянными шайбами).
Стенды Axiom / OpenIDE / Amplicode за то, что предлагаете альтернативный инструментарий для разработчиков.
Как говорится, до встречи в следующем году!
P.S. Axiom анонсировал бесплатный митап JavaRockStars в декабре, поэтому есть возможность увидеться уже довольно скоро.
👍12🔥3❤2
Пишем сервис на Spring c помощью Codex - новое видео
➡️ YouTube | RuTube | VK Видео
В этом видео я покажу основные подходы при разработке типовых rest-сервисов на Spring и Kotlin с помощью AI-агентов. В данном примере используется Codex от Open AI в режиме консольного агента. Эти подходы применимы и ко многим другим агентам (например, qwen code).
➡️ YouTube | RuTube | VK Видео
В этом видео я покажу основные подходы при разработке типовых rest-сервисов на Spring и Kotlin с помощью AI-агентов. В данном примере используется Codex от Open AI в режиме консольного агента. Эти подходы применимы и ко многим другим агентам (например, qwen code).
👍5🔥4❤2
Функциональные интерфейсы в Java - новое видео
➡️ YouTube | RuTube | VK Видео
В основе Stream API, которое значительно упрощает работу с коллекциями в Java, лежит понятие функциональных интерфейсов. Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией
В данном видео рассмотрим наиболее употребимые функциональные интерфейсы стандартной библиотеки. Все эти интерфейсы находятся в пакете
➡️ YouTube | RuTube | VK Видео
В основе Stream API, которое значительно упрощает работу с коллекциями в Java, лежит понятие функциональных интерфейсов. Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией
@FunctionalInterface.В данном видео рассмотрим наиболее употребимые функциональные интерфейсы стандартной библиотеки. Все эти интерфейсы находятся в пакете
java.util.function.👍7🔥4❤1