Живая телеметрия без overhead
Если вам нужно анализировать производительность приложения в реальном времени, но профилировщики вроде VisualVM или async-profiler слишком тяжелые, то Java Flight Recorder (JFR) Event Streaming — ваш новый лучший друг.
JFR давно встроен в JVM и собирает метрики без ощутимого влияния на производительность (накладные расходы <1%). Раньше, чтобы получить данные, нужно было снимать дамп и разбирать его постфактум. Начиная с Java 14 пакет jdk.jfr.consumer предоставляет API, благодаря которому можно стримить события в реальном времени прямо в приложение.
🟢 Пример использования
Допустим, вы хотите следить за количеством вызовов System.gc() (или любыми другими JVM-событиями):
🟢 Что происходит
🔘 EventStream.openRepository() — подключается к JFR и слушает события онлайн
🔘 onEvent("jdk.GarbageCollection", callback) — подписывается на сборку мусора
🔘 stream.start(); — запускает стриминг
🟢 Где полезно
1️⃣ Мониторинг продакшена — следите за GC, JIT-компиляцией, блокировками потоков без перезапуска JVM.
2️⃣ Анализ нагрузки — получайте данные о CPU, аллокациях памяти, I/O в реальном времени.
3️⃣ Трассировка медленных запросов — находите узкие места без включения дорогих профилировщиков.
🟢 Что нужно знать
🔘 Работает без agent'ов и почти без overhead.
🔘 Доступно из коробки в OpenJDK 14+.
🔘 Встроенные события JVM уже можно стримить, но для своих нужно создать Custom JFR Events.
❓ Вы уже пробовали JFR Event Streaming?
✅ Java библиотека #java
Если вам нужно анализировать производительность приложения в реальном времени, но профилировщики вроде VisualVM или async-profiler слишком тяжелые, то Java Flight Recorder (JFR) Event Streaming — ваш новый лучший друг.
JFR давно встроен в JVM и собирает метрики без ощутимого влияния на производительность (накладные расходы <1%). Раньше, чтобы получить данные, нужно было снимать дамп и разбирать его постфактум. Начиная с Java 14 пакет jdk.jfr.consumer предоставляет API, благодаря которому можно стримить события в реальном времени прямо в приложение.
Допустим, вы хотите следить за количеством вызовов System.gc() (или любыми другими JVM-событиями):
import jdk.jfr.consumer.*;
public class JfrStreamingExample {
public static void main(String[] args) {
try (var stream = EventStream.openRepository()) {
stream.onEvent("jdk.GarbageCollection", event ->
System.out.println("GC event: " + event.getLong("gcId"))
);
stream.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤6🔥3
📚 Awesome JavaFX — это тщательно подобранная коллекция ресурсов, включающая фреймворки, библиотеки, руководства и примеры кода, которые помогут ускорить написание кода.
Здесь собраны множество полезных инструментов для разработчиков всех уровней - от учебных материалов для новичков до продвинутых решений вроде TornadoFX.
Пользуйтесь ☕️
🖥 GitHub
✅ Java библиотека #java
Здесь собраны множество полезных инструментов для разработчиков всех уровней - от учебных материалов для новичков до продвинутых решений вроде TornadoFX.
Пользуйтесь ☕️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4❤3
— Чёткая структура проекта и стандартизация.
— Огромное количество доступных плагинов.
— Репозитории (Maven Central) делают управление зависимостями удобным.
— XML-файлы могут раздуваться и становиться громоздкими.
— Скорость сборки ниже по сравнению с Gradle.
— Сложнее писать кастомные задачи (Goals).
— Поддерживает Groovy и Kotlin DSL.
— Более быстрая сборка благодаря инкрементальному билду и кэшированию.
— Меньше кода в конфигурации по сравнению с Maven.
— Меньше стандартов, возможна путаница с конфигурацией.
— Выше порог вхождения, особенно если переходите с Maven.
— Может быть сложнее отлаживать проблемы со сборкой.
👍🏼 — Maven, 🔥 — Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
👍110🔥58❤1
Forwarded from Java News
Основные паттерны микросервисной архитектуры: Strangler Fig, API Gateway, Service Mesh и другие
В данной статье мы разберем несколько ключевых паттернов, связанных с микросервисами. Речь пойдет о паттернах миграции и интеграции (таких как Strangler Fig – «удушающее дерево» и API Gateway), о сетевых и структурных паттернах (Service Mesh, Sidecar), о шаблонах работы с данными (Database per Service, CQRS) и об особом подходе к хранению состояния (Event Sourcing). Для каждого паттерна мы рассмотрим его суть, назначение, примеры использования, а также плюсы и возможные сложности. К некоторым паттернам приведены упрощенные диаграммы и фрагменты кода, чтобы иллюстративно показать, как они работают на практике.
Читать статью
В данной статье мы разберем несколько ключевых паттернов, связанных с микросервисами. Речь пойдет о паттернах миграции и интеграции (таких как Strangler Fig – «удушающее дерево» и API Gateway), о сетевых и структурных паттернах (Service Mesh, Sidecar), о шаблонах работы с данными (Database per Service, CQRS) и об особом подходе к хранению состояния (Event Sourcing). Для каждого паттерна мы рассмотрим его суть, назначение, примеры использования, а также плюсы и возможные сложности. К некоторым паттернам приведены упрощенные диаграммы и фрагменты кода, чтобы иллюстративно показать, как они работают на практике.
Читать статью
VK
Основные паттерны микросервисной архитектуры: Strangler Fig, API Gateway, Service Mesh и другие
Микросервисная архитектура стала де-факто стандартом для построения современных масштабируемых приложений. Вместо единого монолитного при..
👍15❤3🔥3
🐈 BallCat — инструмент для быстрой разработки Java-проектов с акцентом на минимализм и расширяемость.
Проект примечателен своей модульностью: вместо монолитного фреймворка он предлагает набор независимых инструментов, которые можно подключать по мере необходимости. Особый интерес вызывает встроенная поддержка китайских технологических стандартов, что делает его привлекательным для локального рынка.
🖥 GitHub
✅ Java библиотека #java
Проект примечателен своей модульностью: вместо монолитного фреймворка он предлагает набор независимых инструментов, которые можно подключать по мере необходимости. Особый интерес вызывает встроенная поддержка китайских технологических стандартов, что делает его привлекательным для локального рынка.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥3
В чем разница между map() и flatMap()?
Оба метода используются для трансформации данных в Stream, но с ключевыми отличиями:
▪️ map(Function<T, R>) применяет функцию к каждому элементу потока и возвращает поток с преобразованными элементами (Stream<R>).
▪️ flatMap(Function<T, Stream<R>>) делает то же самое, но ожидает, что функция вернет Stream<R>, а затем "выпрямляет" вложенные потоки в один Stream<R>.
📌 Пример:
✅ Java библиотека #java
Оба метода используются для трансформации данных в Stream, но с ключевыми отличиями:
▪️ map(Function<T, R>) применяет функцию к каждому элементу потока и возвращает поток с преобразованными элементами (Stream<R>).
▪️ flatMap(Function<T, Stream<R>>) делает то же самое, но ожидает, что функция вернет Stream<R>, а затем "выпрямляет" вложенные потоки в один Stream<R>.
List<String> words = List.of("Hello", "World");
// map(): превращает каждое слово в список символов
List<List<Character>> mapped = words.stream()
.map(word -> word.chars()
.mapToObj(c -> (char) c)
.toList())
.toList();
// flatMap(): превращает каждое слово в поток символов и "сплющивает" их в один поток
List<Character> flatMapped = words.stream()
.flatMap(word -> word.chars()
.mapToObj(c -> (char) c))
.toList();
System.out.println(mapped); // [[H, e, l, l, o], [W, o, r, l, d]]
System.out.println(flatMapped); // [H, e, l, l, o, W, o, r, l, d]Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍12❤7
Forwarded from Java News
OpenIDE: первая российская среда разработки с поддержкой Java 24
Наконец-то состоялся официальный релиз OpenIDE – независимой российской среды разработки, которую совместно создают «Группа Астра», Axiom JDK и Haulmont.
Проект стартовал как open source-инициатива в конце прошлого года и всего за полгода прошёл путь от идеи до стабильной версии. В числе ключевых фич — поддержка Java 24 уже "из коробки", собственный маркетплейс плагинов и "многоязычность".
В статье — ключевые достижения, проблемы, а также планы по развитию OpenIDE и её экосистемы.
Читать статью
Наконец-то состоялся официальный релиз OpenIDE – независимой российской среды разработки, которую совместно создают «Группа Астра», Axiom JDK и Haulmont.
Проект стартовал как open source-инициатива в конце прошлого года и всего за полгода прошёл путь от идеи до стабильной версии. В числе ключевых фич — поддержка Java 24 уже "из коробки", собственный маркетплейс плагинов и "многоязычность".
В статье — ключевые достижения, проблемы, а также планы по развитию OpenIDE и её экосистемы.
Читать статью
VK
OpenIDE: первая российская среда разработки с поддержкой Java 24
Наконец-то состоялся официальный релиз OpenIDE – независимой российской среды разработки, которую совместно создают «Группа Астра», Axiom..
👍33😁8🔥5❤4
This media is not supported in your browser
VIEW IN TELEGRAM
Ctrl + C и Ctrl + V, тебе точно понравится и Ctrl + W. Это как выделение текста с помощью AI 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
💯12🔥4❤2👍2🎄1
Улучшаем работу с Optional
Все используют Optional, но не все знают, как сделать это лучше. Нередко можно встретить такой код:
Такой код не только избыточен, но и может привести к NoSuchElementException, если забыть проверить isPresent(). Поэтому лучше использовать ifPresent(), чтобы оптимизировать код:
📌 Какие ещё варианты
— Для выполнения действия, если значение есть (ifPresent()).
— Для подстановки дефолтного значения (orElse() / orElseGet()).
— Для обработки исключений (orElseThrow()).
⚠️ Плохие практики
🔘 Использовать Optional в качестве аргументов методов — это ломает читаемость API.
🔘 Использовать Optional.get() без проверки — это сводит всю пользу Optional на нет.
✅ Java библиотека #java
Все используют Optional, но не все знают, как сделать это лучше. Нередко можно встретить такой код:
Optional<User> userOpt = findUserById(id);
if (userOpt.isPresent()) {
User user = userOpt.get();
processUser(user);
}
Такой код не только избыточен, но и может привести к NoSuchElementException, если забыть проверить isPresent(). Поэтому лучше использовать ifPresent(), чтобы оптимизировать код:
findUserById(id).ifPresent(this::processUser);
— Для выполнения действия, если значение есть (ifPresent()).
— Для подстановки дефолтного значения (orElse() / orElseGet()).
— Для обработки исключений (orElseThrow()).
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤5🔥3
Техника «10 тестов в день» – одна из самых эффективных в изучении Java.
Канал Java Guru выложил в открытый доступ тесты, которые дают на собеседованиях в топовые компании, вроде Яндекс и MailRu.
➤ Открываете задачку – выбираете вариант – видите правильный ответ и детальное объяснение к нему. Так вы усвоите на 50% больше знаний в сжатые сроки.
Подписывайтесь и качайте свои скиллы: @javatasks
Канал Java Guru выложил в открытый доступ тесты, которые дают на собеседованиях в топовые компании, вроде Яндекс и MailRu.
➤ Открываете задачку – выбираете вариант – видите правильный ответ и детальное объяснение к нему. Так вы усвоите на 50% больше знаний в сжатые сроки.
Подписывайтесь и качайте свои скиллы: @javatasks
👍7❤2🔥2
Forwarded from Java News
Cтатья про собеседования в Яшу (Yandex Weekend Offer)
Может кому-то это будет интересно, даст возможность лучше подготовиться; или наоборот кто-то примет решение не участвовать.
Коротко о себе: 41 год, senior software developer, стаж > 20 лет. Однако, как я понял, эти собесы все равно для всех одинаковые, так чтоб все написанное актуально и для молодежи.
Итак, угораздило меня согласиться на т. н. «Weekend Offer на позицию разработчика на Kotlin». Вообще‑то мне больше нравится Scala, и опыта по ней гораздо больше, но рекрутерша была сильно настойчива, и я решил обновить экспиренс, а возможно, и прибавку в деньгах. И вот что было дальше.
Читать статью
Может кому-то это будет интересно, даст возможность лучше подготовиться; или наоборот кто-то примет решение не участвовать.
Коротко о себе: 41 год, senior software developer, стаж > 20 лет. Однако, как я понял, эти собесы все равно для всех одинаковые, так чтоб все написанное актуально и для молодежи.
Итак, угораздило меня согласиться на т. н. «Weekend Offer на позицию разработчика на Kotlin». Вообще‑то мне больше нравится Scala, и опыта по ней гораздо больше, но рекрутерша была сильно настойчива, и я решил обновить экспиренс, а возможно, и прибавку в деньгах. И вот что было дальше.
Читать статью
VK
Cтатья про собеседования в Яшу (Yandex Weekend Offer)
Может кому‑то это будет интересно, даст возможность лучше подготовиться; или наоборот кто‑то примет решение не участвовать.
🔥21👍7❤3
Media is too big
VIEW IN TELEGRAM
Изучаешь Java - создай проект. Перезагрузка.
Выпуск 3. Архитектура ГРН.
В этом выпуске мы поговорим об архитектуре, требованиях, доступности и получим интересный результат.
🌐 🗣 СМОТРЕТЬ VKVIDEO
✅ Java библиотека #java
Выпуск 3. Архитектура ГРН.
В этом выпуске мы поговорим об архитектуре, требованиях, доступности и получим интересный результат.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥9❤3
Мне НЕ нужно разбираться с управлением памятью в Java, так как за меня всё делает GC
Garbage Collector (GC) действительно очищает неиспользуемые объекты, которые больше не имеют активных ссылок. Благодаря этому в Java не нужно вручную освобождать память, как в C++.
Несколько предпосылок к исходному тезису:
GC удаляет только те объекты, которые больше не имеют активных ссылок. Если же объект остаётся доступным, но фактически не используется, он будет занимать память до завершения работы приложения.
Если создать static List и постоянно добавлять в него объекты, они никогда не будут удалены GC, потому что статические поля живут весь срок жизни приложения.
public class MemoryLeak {
private static final List<byte[]> cache = new ArrayList<>();
public static void main(String[] args) {
while (true) {
cache.add(new byte[10 * 1024 * 1024]);
System.out.println("Добавили 10MB в кеш. Используемая память: " +
(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + "MB");
}
}
}Через пару минут — OutOfMemoryError
Объекты, хранящиеся в ThreadLocal, привязываются к потоку, а в пуле потоков они могут жить дольше, чем нужно.
public class ThreadLocalLeak {
private static final ThreadLocal<byte[]> threadLocalData = new ThreadLocal<>();
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
threadLocalData.set(new byte[10 * 1024 * 1024]); // 10MB на поток
System.out.println("Память занята потоком!");
});
}
executor.shutdown();
}
}Поток завершится, а память останется занята, потому что ThreadLocal не очищается автоматически.
Если анонимный класс или лямбда-ссылка ссылается на внешний объект, она может мешать GC очистить его.
public class InnerClassLeak {
private String data = "Очень важные данные";
public void createAnonymousClass() {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Используем: " + data);
}
};
new Thread(task).start();
}
}task ссылается на data, даже если InnerClassLeak больше не используется → GC не очистит объект.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥8❤3
Spring Boot Tutorial for Beginners | Full Course 2025
Learn how to build real-world backend applications with Spring Boot in this hands-on crash course. Whether you're new to Spring Boot or want a solid refresher, this tutorial covers everything you need to start building Java-based REST APIs with Spiring Boot, Spring Data JPA, PostgreSQL, and Docker.
🌐 🗣 СМОТРЕТЬ VKVIDEO
✅ Java библиотека #java
Learn how to build real-world backend applications with Spring Boot in this hands-on crash course. Whether you're new to Spring Boot or want a solid refresher, this tutorial covers everything you need to start building Java-based REST APIs with Spiring Boot, Spring Data JPA, PostgreSQL, and Docker.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2🔥2
📊 MQCloud — корпоративный центр управления RocketMQ.
Это единая платформа, которая объединяет управление очередями, мониторинг и алертинг в одном интерфейсе.
Сервис уже обслуживает десятки серверов, сотни топиков и миллиарды сообщений ежедневно. Он умеет показывать топологию кластеров, детализацию по производителям и потребителям, а также предупреждать о проблемах вроде скопления сообщений или сбоев.
Особенно удобно, что MQCloud разграничивает права: обычные пользователи видят только свои очереди, а администраторы получают полный контроль с возможностью согласования изменений.
🖥 GitHub
✅ Java библиотека #java
Это единая платформа, которая объединяет управление очередями, мониторинг и алертинг в одном интерфейсе.
Сервис уже обслуживает десятки серверов, сотни топиков и миллиарды сообщений ежедневно. Он умеет показывать топологию кластеров, детализацию по производителям и потребителям, а также предупреждать о проблемах вроде скопления сообщений или сбоев.
Особенно удобно, что MQCloud разграничивает права: обычные пользователи видят только свои очереди, а администраторы получают полный контроль с возможностью согласования изменений.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥3
Как устроен кеш в Spring Boot?
Spring Boot упрощает кеширование благодаря аннотациям и встроенной интеграции с разными кеш-провайдерами (EhCache, Caffeine, Redis и др.). Spring использует Spring Cache Abstraction, которая оборачивает кеширующую логику в аннотации:
🔘 @Cacheable — кладёт результат в кеш
🔘 @CachePut — обновляет кеш
🔘 @CacheEvict — удаляет из кеша
За кулисами используется прокси (через Spring AOP или CGLIB), который перехватывает вызовы методов, проверяет кеш и возвращает либо сохранённое значение, либо выполняет метод и кеширует результат.
🔍 Что под капотом
Если вызвать метод с @Cacheable, Spring выполняет несколько шагов:
1. Определяет ключ кеша
🔘 По умолчанию ключ формируется из параметров метода
🔘 Можно задать кастомный ключ через key = "#id"
2. Проверяет кеш-провайдер
🔘 Дефолтный провайдер — ConcurrentHashMap
🔘 Можно подключить Redis, Caffeine, EhCache и т. д.
3. Возвращает данные
🔘 Если значение есть в кеше — сразу отдаётся
🔘 Если нет – вызывается метод и результат сохраняется в кеше
⚠️ Нюансы
— Кеш работает только для Spring-управляемых бинов (если метод вызван внутри того же класса — кеш не сработает)
— Не кешируйте изменяемые объекты, иначе возможны неожиданные побочные эффекты
— Очищайте кеш, если данные меняются (@CacheEvict)
✅ Java библиотека #java
Spring Boot упрощает кеширование благодаря аннотациям и встроенной интеграции с разными кеш-провайдерами (EhCache, Caffeine, Redis и др.). Spring использует Spring Cache Abstraction, которая оборачивает кеширующую логику в аннотации:
За кулисами используется прокси (через Spring AOP или CGLIB), который перехватывает вызовы методов, проверяет кеш и возвращает либо сохранённое значение, либо выполняет метод и кеширует результат.
Если вызвать метод с @Cacheable, Spring выполняет несколько шагов:
1. Определяет ключ кеша
2. Проверяет кеш-провайдер
3. Возвращает данные
— Кеш работает только для Spring-управляемых бинов (если метод вызван внутри того же класса — кеш не сработает)
— Не кешируйте изменяемые объекты, иначе возможны неожиданные побочные эффекты
— Очищайте кеш, если данные меняются (@CacheEvict)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤2🔥2
public class Mystery {
public static void main(String[] args) {
System.out.println(method(true) + method(false));
}
static String method(boolean flag) {
return flag ? "Yes" : "No";
}
static String method(String val) {
return val.toUpperCase();
}
}
Что выведет программа, пишите в комментариях?
A) YesNo
B) YESNO
C) Ошибка компиляции
D) null
✅ Правильный ответ:
➡️ Вызов
method(true)method(false)method(boolean)Результат:
"YesNo"method(String)Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤6🔥4
Оптимизация работы с JDBC в высоконагруженных приложениях
Неэффективное использование JDBC может легко стать узким местом и убить производительность. Вот пошаговый разбор, как сделать работу с JDBC быстрее и стабильнее.
1️⃣ Настраиваем connection pool
Используйте HikariCP, Apache DBCP или C3P0 вместо стандартного DriverManager. Это позволит переиспользовать соединения, а не открывать новое на каждый запрос.
2️⃣ Используем подготовленные запросы (PreparedStatement)
Во-первых, это снижает нагрузку на базу за счёт кеширования плана запроса. Во-вторых, убирает SQL-инъекции на уровне JDBC.
3️⃣ Выбираем правильный тип курсора ResultSet
— TYPE_FORWARD_ONLY, если нужно просто пробежать по данным.
— TYPE_SCROLL_INSENSITIVE позволяет скроллить данные, но требует больше памяти.
— TYPE_SCROLL_SENSITIVE редко нужен, но обновляет данные в реальном времени.
4️⃣ Ограничиваем выборку данных (LIMIT / FETCH FIRST)
Не забирайте сразу всю таблицу – старайтесь выбирать только нужные поля и ограничивать количество строк.
5️⃣ Выключаем автокоммиты
По умолчанию, каждый запрос в JDBC – это отдельная транзакция. Включите setAutoCommit(false) и коммитите изменения пачками, чтобы уменьшить нагрузку.
6️⃣ Логируем медленные запросы
Если какие-то SQL-запросы выполняются слишком долго – используйте SLF4J + P6Spy или встроенные средства логирования в пуле соединений, чтобы их отлавливать.
❓ Какие техники считаете самыми полезными?
✅ Java библиотека #java
Неэффективное использование JDBC может легко стать узким местом и убить производительность. Вот пошаговый разбор, как сделать работу с JDBC быстрее и стабильнее.
Используйте HikariCP, Apache DBCP или C3P0 вместо стандартного DriverManager. Это позволит переиспользовать соединения, а не открывать новое на каждый запрос.
Во-первых, это снижает нагрузку на базу за счёт кеширования плана запроса. Во-вторых, убирает SQL-инъекции на уровне JDBC.
— TYPE_FORWARD_ONLY, если нужно просто пробежать по данным.
— TYPE_SCROLL_INSENSITIVE позволяет скроллить данные, но требует больше памяти.
— TYPE_SCROLL_SENSITIVE редко нужен, но обновляет данные в реальном времени.
Не забирайте сразу всю таблицу – старайтесь выбирать только нужные поля и ограничивать количество строк.
По умолчанию, каждый запрос в JDBC – это отдельная транзакция. Включите setAutoCommit(false) и коммитите изменения пачками, чтобы уменьшить нагрузку.
Если какие-то SQL-запросы выполняются слишком долго – используйте SLF4J + P6Spy или встроенные средства логирования в пуле соединений, чтобы их отлавливать.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤8🔥4
Kotlin в действии, 2-е изд. (2025) PDF. ePUB
Kotlin — простой и высокопроизводительный язык программирования, достаточно гибкий для работы с любыми веб-, мобильными, облачными и корпоративными приложениями. Разработчики приложений на Java по достоинству оценят простой синтаксис, интуитивно понятную систему типов, набор превосходных инструментов и поддержку функционального программирования. Кроме того, поскольку Kotlin работает на JVM, он легко интегрируется с существующим Java-кодом, библиотеками и фреймворками, включая Spring и Android.
Во второе издание бестселлера «Kotlin в действии» добавлено описание корутин, структурированного параллелизма и других новых возможностей языка. Это авторитетное руководство, написанное основными членами команды разработки языка Kotlin, представляет полезные методы использования стандартной библиотеки Kotlin, функционального программирования и расширенных возможностей, таких как обобщенное программирование и рефлексия.
Kotlin — простой и высокопроизводительный язык программирования, достаточно гибкий для работы с любыми веб-, мобильными, облачными и корпоративными приложениями. Разработчики приложений на Java по достоинству оценят простой синтаксис, интуитивно понятную систему типов, набор превосходных инструментов и поддержку функционального программирования. Кроме того, поскольку Kotlin работает на JVM, он легко интегрируется с существующим Java-кодом, библиотеками и фреймворками, включая Spring и Android.
Во второе издание бестселлера «Kotlin в действии» добавлено описание корутин, структурированного параллелизма и других новых возможностей языка. Это авторитетное руководство, написанное основными членами команды разработки языка Kotlin, представляет полезные методы использования стандартной библиотеки Kotlin, функционального программирования и расширенных возможностей, таких как обобщенное программирование и рефлексия.
👍13❤4🔥3