ch
Feedback
Библиотека Java разработчика

Библиотека Java разработчика

前往频道在 Telegram

📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP

显示更多

📈 Telegram 频道 Библиотека Java разработчика 的分析概览

频道 Библиотека Java разработчика (@bookjava) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 10 280 名订阅者,在 技术与应用 类别中位列第 12 030,并在 俄罗斯 地区排名第 63 913

📊 受众指标与增长动态

невідомо 创建以来,项目保持高速增长,吸引了 10 280 名订阅者。

根据 05 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 20,过去 24 小时变化为 0,整体触达仍然可观。

  • 认证状态: 未认证
  • 互动率 (ER): 平均受众互动率为 8.29%。内容发布后 24 小时内通常能获得 3.77% 的反应,占订阅者总量。
  • 帖子覆盖: 每篇帖子平均可获得 852 次浏览,首日通常累积 388 次浏览。
  • 互动与反馈: 受众积极参与,单帖平均反应数为 6
  • 主题关注点: 内容集中在 string, интерфейс, строка, boot, api 等核心主题上。

📝 描述与内容策略

作者将该频道定位为表达主观观点的平台:
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP

凭借高频更新(最新数据采集于 06 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。

10 280
订阅者
无数据24 小时
+27
+2030
帖子存档
🤯 🤯 🤯 Параллелизм в многопоточном Java-коде создаёт новые проблемы в тестировании, а баги остаются незамеченными? ⚡️ Пригл
🤯 🤯 🤯 Параллелизм в многопоточном Java-коде создаёт новые проблемы в тестировании, а баги остаются незамеченными? ⚡️ Приглашаем на открытый вебинар «Юнит тесты для многопоточного кода» 24 июня в 20:00 МСК. На вебинаре мы разберём: ✔️ Как обнаружить гонки, дедлоки и нестабильность в многопоточном коде. ✔️ Как использовать argumentCaptor и spy для проверки взаимодействия потоков. ✔️ Эмуляцию задержек и таймингов с помощью AdditionalAnswers. 🦾 После урока вы будете уверенно писать стабильные unit-тесты для многопоточного кода, выявлять скрытые баги и улучшать качество тестирования. Открытый урок проходит в преддверии старта курса «Java Developer. Advanced». Все участники получат скидку на обучение. 🔗 Регистрируйтесь прямо сейчас: https://vk.cc/cMZNzb Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

💡 Почему в Set.of() в Java нельзя добавить дубликаты и null? Когда используешь Set.of(...), можно столкнуться с двумя неожид
💡 Почему в Set.of() в Java нельзя добавить дубликаты и null? Когда используешь Set.of(...), можно столкнуться с двумя неожиданностями: 1. ❌ Нельзя добавлять дубликаты 2. ❌ Нельзя добавлять null Разбираемся, почему так: 🔐 Set.of(...) — это immutable Set Метод Set.of(...), добавленный в Java 9, создаёт неизменяемое множество. Это значит: * После создания ты не можешь изменить его (добавить, удалить элемент). * Все элементы внутри должны быть уникальны и не должны быть null. 📛 Почему нельзя дубликаты? Потому что Set по определению — это коллекция уникальных элементов. А Set.of(...) бросает IllegalArgumentException, сразу во время создания, если переданы дубликаты:

Set.of("a", "b", "a"); // 💥 Бросит исключение!
Это сделано для того, чтобы не было тихих ошибок — чтобы ты сразу увидел, что передал неуникальные значения. 🕳️ Почему нельзя null? Set.of(...) не принимает null, потому что он реализован через внутренние immutable структуры, которые не допускают null`-значений. При попытке добавить `null получишь NullPointerException.

Set.of("a", null); // 💥 NullPointerException
Это сделано сознательно — null может вести к неочевидным багам и плохо сочетается с концепцией неизменяемых коллекций. 👀 Хочешь изменяемый Set, который принимает null и дубликаты фильтрует сам? Используй HashSet:

Set<String> set = new HashSet<>();
set.add(null); // ✅ Можно
👉@BookJava

+9
Вопросы-ответы собеседования Можно ли создать экземпляр абстрактного класса? Что такое интерфейс? Как вызвать нестатический метод в статическом? Чем отличаются параметры от аргументов в методе? Что такое конструктор? Как его создать и вызвать? Что такое параметризованный конструктор? Что такое конструктор по умолчанию? Что такое приватный конструктор? Зачем он закрытый? Что такое статическая переменная? Как работает static поле? Что такое статический метод? Как вызвать static метод? источник 👉@BookJava

📚 Продвинутые методы архивации: LZ77/78 Приглашаем на открытый урок. 🗓 25 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках стар
📚 Продвинутые методы архивации: LZ77/78 Приглашаем на открытый урок. 🗓 25 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Алгоритмы и структуры данных». ✔️ На этом вебинаре мы завершим создание архиватора, добавив алгоритм LZ77/78. Разберем принцип словарного сжатия, механизм поиска повторяющихся последовательностей и формат их кодирования. ✔️ Имплементируем выбранный алгоритм и проведем финальное сравнение всех трех методов сжатия (RLE, Huffman, LZ77/78). Определим, какие алгоритмы лучше работают для различных типов файлов и почему. Завершающее практическое занятие для тех, кто хочет освоить продвинутые алгоритмы и увидеть их применение в реальном проекте.​​​​​​​​​​​​​​​​ 🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Algo5 👉 Регистрация на вебинар: https://vk.cc/cMXtZN Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🧠 Осторожно с @Transactional на private-методах! Очень частый анти-паттерн, который легко упустить 👇 @Service public class
🧠 Осторожно с @Transactional на private-методах! Очень частый анти-паттерн, который легко упустить 👇 @Service public class UserService { @Transactional private void saveUser(User user) { userRepository.save(user); } public void create() { saveUser(new User()); } } Кажется, всё ок. Но ❌ транзакция НЕ работает. 📌 Почему? Spring AOP использует прокси, а прокси не “видит” вызовы private-методов внутри класса. Такие вызовы происходят напрямую, мимо прокси-обёртки — и аннотация @Transactional просто игнорируется. 💡 Решение: 1. Сделай метод public и вызывай его извне (или из другого бина). 2. Или выдели этот метод в отдельный бин-сервис. Пример: @Service public class UserTransactionalHelper { @Transactional public void saveUser(User user) { userRepository.save(user); } } И в UserService: public void create() { helper.saveUser(new User()); } ⚠️ Так же не работают protected, private, final, static, и @PostConstruct-методы. Нужно помнить: Spring AOP = прокси, а значит, работают только публичные методы, вызываемые ИЗВНЕ. 👉@BookJava

🧠 Коллекторы и toList() в Java 16+: можно ли заменить collect(Collectors.toList()) на просто .toList()? Да, но с нюансами. �
🧠 Коллекторы и toList() в Java 16+: можно ли заменить collect(Collectors.toList()) на просто .toList()? Да, но с нюансами. 📌 Короткий ответ: Если ты используешь Java 16+, можешь заменить:

List<String> list = stream.collect(Collectors.toList());
на:

List<String> list = stream.toList();
💡 Но будь осторожен. Вот 3 ключевых отличия: 1️⃣ Немодифицируемость * .toList() возвращает немодифицируемый список (immutable). * Collectors.toList() возвращает modifiable ArrayList.

var list1 = List.of("a", "b");
var list2 = list1.stream().toList(); 
list2.add("c"); // 💥 UnsupportedOperationException

var list3 = list1.stream().collect(Collectors.toList());
list3.add("c"); // ✅ OK
2️⃣ Тип возвращаемого списка * Collectors.toList() — это ArrayList (или его сабкласс). * .toList() — это неопределённый тип внутри JDK (часто List.of под капотом). Если ты делаешь что-то вроде:

if (list instanceof ArrayList) ...
то поведение может измениться. 3️⃣ Параллельные стримы .toList() оптимизирован для параллельных стримов: может работать быстрее, но также может повлиять на порядок, если ты этого явно не контролируешь. ⚠️ Когда НЕ стоит заменять: * Если ты мутируешь список после получения. * Если ты полагаешься на конкретный тип (например, ArrayList). * Если ты используешь Java < 16. ✅ Когда заменить можно: * Если тебе нужен read-only список. * Если ты не изменяешь коллекцию. * Если важна сжатость и выразительность. 📌 Резюме:
Заменяй collect(Collectors.toList()) на .toList(), только если тебе действительно не нужен изменяемый список. Это безопасно при соблюдении условий, но может привести к неожиданным багам в тестах и проде, если забыть про неизменяемость.
👉@BookJava

VK Weekend Offer: отправьте заявку, пройдите интервью и получите офер! 28–29 июня VK проведёт Weekend Offer для бэкендеров с
VK Weekend Offer: отправьте заявку, пройдите интервью и получите офер! 28–29 июня VK проведёт Weekend Offer для бэкендеров с опытом от трёх лет. Участников со знанием Java, Go, Python или C++ ждут технические собеседования, знакомство с продуктами и, если всё сложится, офер уже в конце выходных. Ребята много лет создают облачные решения, системы рекомендаций и поисковые движки — всё с миллионами пользователей в проде — и сейчас ищут новых коллег. Поэтому оставляйте заявку до 25 июня, чтобы попасть в команду за выходные! Подробности — на сайте.

🧠 Record (Java 16+) + pattern matching для instanceof (Java 14+) в Java 17+ позволяют писать лаконичный и безопасный код: 📌
🧠 Record (Java 16+) + pattern matching для instanceof (Java 14+) в Java 17+ позволяют писать лаконичный и безопасный код: 📌 Запись DTO с валидацией через компактный конструктор:

public record User(String name, String email) {
    public User {
        Objects.requireNonNull(name, "name не должен быть null");
        if (!email.contains("@")) {
            throw new IllegalArgumentException("Неверный email: " + email);
        }
    }
}
– автоматические toString(), equals(), hashCode() без лишнего кода. 🧠 Проверка и приведение типов в одном выражении:

Object obj = …;
if (obj instanceof User u) {
    System.out.println("Привет, " + u.name());
}
– нет лишних кастов, код чище и безопаснее. 💡 Совет: для полей — коллекций или массивов — избегайте поверхностной мутабельности:

public record Team(String name, List<String> members) {
    public Team {
        members = List.copyOf(members);
    }
}
– таким образом members нельзя изменить извне. ⚠️ Антипаттерн: не используйте public record X(List<String> list) без копирования — рискуете нарушить неизменяемость! 👉@BookJava

🧠 JPA Batch Insert: ускоряем и защищаем от OOM 📌 Настройка Hibernate Добавьте в application.yml или properties: spring: jpa
🧠 JPA Batch Insert: ускоряем и защищаем от OOM 📌 Настройка Hibernate Добавьте в application.yml или properties:

spring:
  jpa:
    properties:
      hibernate.jdbc.batch_size: 50      # размер пакета
      hibernate.order_inserts: true      # группировка INSERT’ов
      hibernate.order_updates: true      # группировка UPDATE’ов
Это позволит драйверу посылать пачками, а Hibernate — сортировать операции для максимальной эффективности. 💡 Сниппет для batch-пакетов

@Service
@RequiredArgsConstructor
public class OrderService {
    private final EntityManager em;
    private static final int BATCH_SIZE = 50;

    @Transactional
    public void saveAll(List<Order> orders) {
        for (int i = 0; i < orders.size(); i++) {
            em.persist(orders.get(i));
            if (i > 0 && i % BATCH_SIZE == 0) {
                em.flush();
                em.clear();  // освобождаем persistence-context
            }
        }
        em.flush();
        em.clear();
    }
}
flush() выталкивает пакеты в БД, – clear() освобождает ОЗУ от управляемых сущностей. ⚠️ Важные моменты * GenerationType.IDENTITY отключает batching. Используйте @SequenceGenerator с allocationSize. * При двусторонних связях (OneToMany) избегайте каскадного сохранения огромных графов — лучше сохранять “плоско” и затем связывать. * Следите за JDBC-драйвером: не все поддерживают batch-вставки одинаково хорошо. 💡 Совет по мониторингу Запустите приложение с -Dorg.hibernate.SQL=DEBUG и -Dhibernate.format_sql=true — вы увидите групповые INSERT вместо множества одиночных. 📌 Результат * Скорость записи растёт в 5–10× (в зависимости от нагрузки). * Память на стороне приложения остаётся стабильной, без роста Persistence Context. 👉@BookJava

👩‍💻 JPQL: как писать запросы, которые не сломают Hibernate Узнайте, как писать JPQL-запросы, которые ускорят Hibernate в 5
👩‍💻 JPQL: как писать запросы, которые не сломают Hibernate Узнайте, как писать JPQL-запросы, которые ускорят Hibernate в 5 раз, избегая критических ошибок, тормозящих 80% проектов! Приглашаем на открытый урок 🗓 19 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional». 🎯 О чём поговорим: ✔️- JPQL vs SQL: почему ваши запросы ломают Hibernate и как их переписать так, чтобы БД не «умирала» под нагрузкой. ✔️ Тайные ловушки: антипаттерны JPQL, генерирующие N+1 SELECT и тормозящие приложение, и методы их поиска в коде. ✔️ Оптимизация на максимум: как использовать JOIN FETCH, подзапросы и кэширование в JPQL для мгновенного ускорения Hibernate. 👥 Кому будет интересно: Java-разработчикам, использующим Hibernate, системным архитекторам и инженерам по оптимизации производительности. 💡В результате урока вы: Научитесь писать эффективные JPQL-запросы, избегать распространённых ошибок и значительно ускорять работу Hibernate-приложений. 🎁 Дарим промокод, который дает скидку на обучение - JAVA_06 🔗 Ссылка на регистрацию: https://vk.cc/cMKvog Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

📌 CRaC (Coordinated Restore at Checkpoint) — горячая JVM-фишка для сверхбыстрого cold-start: сохраняем состояние приложения после инициализации и моментально «восстанавливаем» при рестарте. 🧠 Как это работает 1. JVM создаёт снимок (checkpoint) всего heap- и native-состояния сразу после bootstrap и bean-инициализации. 2. При рестарте JVM грузит этот снимок вместо полной загрузки классов и прогрева JIT. 💡 Подключение в Java 21+ 1. Включите экспериментальный модуль:

   --add-modules jdk.crac
   --enable-preview
   
2. Реализуйте CheckpointListener для чистки и восстановления ресурсов:

   import jdk.crac.Core;
   import jdk.crac.Control;
   import jdk.crac.CheckpointListener;
   import jdk.crac.Context;
   import org.springframework.stereotype.Component;

   @Component
   public class CracHandler implements CheckpointListener {
       @Override
       public void beforeCheckpoint(Context<?> ctx) {
           // 📌 Закрываем пулы, Flush в БД, отписываемся от очередей
       }
       @Override
       public void afterRestore(Context<?> ctx) {
           // 💡 Реинициализируем пулы, повторная регистрация listeners
       }
   }
   // Регистрация слушателя
   Core.getGlobalContext().register(new CracHandler());
   
3. Сборка и запуск:

   # Сохраняем checkpoint
   java \
     --add-modules jdk.crac \
     --enable-preview \
     -XX:CRaCCheckpointToDir=crac-checkpoint \
     -jar app.jar

   # Восстанавливаем из него
   java \
     --add-modules jdk.crac \
     --enable-preview \
     -XX:CRaCRestoreFrom=crac-checkpoint \
     -jar app.jar
   
⚠️ Ограничения и нюансы * Не все native-библиотеки безопасны для снапшота. * Тяжёлые background-потоки: до checkpoint лучше останавливать. * Проверяйте на staging-окружении — subtle bugs могут всплыть только после restore. 📌 Зачем это нужно? * 🚀 Ускоренный cold-start для Spring Boot 3+ сервисов (лучшая DevOps-интеграция в контейнерах и serverless). * 💰 Экономия ресурсов в автоскейлируемых кластерах. Простой CRaC-proof-of-concept позволит вам измерить прирост старта ваших микросервисов уже сегодня! 👉@BookJava

⁉️ Монолит или микросервисы? Руководство для архитекторов, которые ценят свои нервы Приглашаем на открытый урок. 🗓 17 июня в
⁉️ Монолит или микросервисы? Руководство для архитекторов, которые ценят свои нервы Приглашаем на открытый урок. 🗓 17 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Software Architect». 📌 Что будет на вебинаре: ✔️ Как не попасть в ловушку “модных” микросервисов; ✔️ Разбор признаков, что пора выходить из монолита; ✔️ Архитектурные паттерны для перехода к микросервисам (Strangler Fig, BFF, Self-contained systems); ✔️ Организационные и технические риски — что точно пойдёт не так и как это предсказать; ✔️ Роль DevOps, CI/CD и мониторинга в выборе архитектуры. 👥 Для кого этот вебинар: - Разработчиков Backend и FullStack, участвующих в архитектурных решениях; - Архитекторов ПО, которые планируют масштабирование приложений; - Тимлидов и DevOps-инженеров, выстраивающих процесс разработки и доставки; - Технических менеджеров, выбирающих стратегию развития продукта. 🎯 После вебинара вы: - Получите пошаговое руководство по выбору архитектуры под ваш проект; - Научитесь оценивать реальные риски и стоимость микросервисов; - Поймёте, как внедрять архитектурные изменения без сбоев и хаоса; - Увидите, как принимать взвешенные архитектурные решения, сохраняя технический контроль и производительность команды. 💡 Идеальный вебинар для тех, кто хочет перестать "архитектурить на ощущениях" и начать действовать стратегически. 🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - SoftwareArc_06 👉 Регистрация на вебинар: https://vk.cc/cMHSzz Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

📌 Stream.toList() vs Collectors.toList() — безопасная замена? 🧠 В Java 16+ появился метод Stream.toList(), который собирает
📌 Stream.toList() vs Collectors.toList() — безопасная замена? 🧠 В Java 16+ появился метод Stream.toList(), который собирает элементы потока в список. Раньше мы писали:

List<String> list = stream.collect(Collectors.toList());
Теперь можно укоротить до:

List<String> list = stream.toList();
💡 Главные отличия: 1️⃣ Неизменяемость toList() возвращает unmodifiable List — любые add()/remove() вылетят UnsupportedOperationException. Если нужен изменяемый список, продолжайте использовать collect(Collectors.toList()) или

stream.collect(Collectors.toCollection(ArrayList::new));
2️⃣ Null-элементы toList() не допускает null и бросит NPE при встрече null в потоке. Collectors.toList() сохранит null без ошибок. 3️⃣ Спецификация Stream.toList() гарантированно создаёт новый список с точным размером, а Collectors.toList() лишь «может» вернуть любой List (часто ArrayList, но без чётких гарантий). ⚠️ Если вам важна мутабельность или поддержка nullне меняйте на toList(). ✅ Если же нужен чистый readonly-список и вы уверены в отсутствии nullсмело переходите на toList() для более лаконичного и потенциально более эффективного кода. Я перехожу на toList() везде, где нужен только чтение — получилось короче и понятнее. 👉@BookJava

⚡️ Быстрые альтернативы HashMap: EnumMap, массивы и примитивные коллекции 🧠 EnumMap вместо HashMap (enum-ключи) 📌 EnumMap х
⚡️ Быстрые альтернативы HashMap: EnumMap, массивы и примитивные коллекции 🧠 EnumMap вместо HashMap (enum-ключи) 📌 EnumMap<K, V> хранит данные в массиве → нет хеширования и boxing’а.

EnumMap<Status, String> map = new EnumMap<>(Status.class);
map.put(Status.STARTED, "Запущен");
String status = map.get(Status.STARTED);
⚠️ Работает только для enum-ключей. 🧠 Прямой массив для плотных int-ключей 📌 Используйте массив вместо Map, если ключи — диапазон [0…MAX] и известны заранее.

int MAX = 1000;
var cache = new String[MAX + 1];
cache[42] = "ответ";
String result = cache[42];
💡 O(1), без коллизий и аллокаций объектов. ⚠️ Память линейно зависит от MAX. 🧠 Специализированные коллекции для примитивов 📌 Библиотеки fastutil, HPPC, Trove и др.

var fastMap = new it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap<String>();
fastMap.put(42, "ответ");
String res = fastMap.get(42);
💡 Избегаете boxing/unboxing и получаете быстрее операции. 🧠 Switch-expression / tableswitch 📌 Для фиксированного набора целых или enum-ключей генерируйте switch, а не Map.

String handle(int code) {
    return switch (code) {
        case 100 -> "OK";
        case 200 -> "Created";
        default  -> "Other";
    };
}
💡 JIT компилирует switch в tableswitch или lookupswitch — молниеносно. 💡 Выбирайте стратегию под конкретную задачу: - EnumMap — enum-ключи - Массив — плотные int-диапазоны - fastutil/HPPC — примитивы с большим диапазоном - Switch — фиксированный набор значений 👉@BookJava

+4
Test Driven Development (TDD) in Java Creating a Queue Abstract Data Type class Introduction to Test Doubles Dummies and Stubs Introduction to Test Doubles Spies Introduction to Test Doubles Mocks Introduction to Test Doubles - Fakes источник 👉@BookJava

🚀 Spring WebFlux с Server-Sent Events 🚀 Улучшите свои приложения в режиме реального времени с помощью #SpringWebFlux и Serv
🚀 Spring WebFlux с Server-Sent Events 🚀 Улучшите свои приложения в режиме реального времени с помощью #SpringWebFlux и Server-Sent Events! 🔥 👉@BookJava

📚 Эффективное сжатие текста: код Хаффмана в действии Приглашаем на открытый урок. 🗓 11 июня в 20:00 МСК 🆓 Бесплатно. Урок
📚 Эффективное сжатие текста: код Хаффмана в действии Приглашаем на открытый урок. 🗓 11 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Алгоритмы и структуры данных». На этом вебинаре мы продолжим разработку архиватора, реализовав код Хаффмана. ✔️ Рассмотрим, как построить дерево кодов, где частота появления символов определяет их битовое представление. ✔️ Интегрируем алгоритм в наш архиватор и проведем сравнительное тестирование с RLE. ✔️ Увидим, как эффективно работает код Хаффмана на текстовых файлах и других типах данных. Отличная возможность изучить продвинутые древовидные структуры данных на практическом примере. Развивайте алгоритмическое мышление, увеличивайте производительность программ. 🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Algo5 👉 Регистрация на вебинар: https://vk.cc/cMzyUv Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🎯 Java-хаки: динамический вывод с помощью printf() Статья посвящена методу printf() в Java, который используется для создани
🎯 Java-хаки: динамический вывод с помощью printf() Статья посвящена методу printf() в Java, который используется для создания форматированной строки вывода. В ней рассматривается синтаксис метода, различные спецификаторы формата (например, %d, %f, %s и т.д.) и то, как с их помощью управлять отображением чисел, строк и других типов данных в консоли. Приведены примеры использования System.out.printf() с пояснениями по флагам, ширинe и точности форматирования, а также показано, как легко создавать динамический и читаемый вывод в приложениях на Java. https://springframework.guru/java-output-printf-method/ 👉@BookJava

Структурированное логирование в Spring Boot 3.5.5 Spring Boot 3.5.5 приносит улучшенное структурированное логирование. Чтобы
Структурированное логирование в Spring Boot 3.5.5 Spring Boot 3.5.5 приносит улучшенное структурированное логирование. Чтобы его включить, добавьте следующее в ваш application.yml: Это обеспечивает более чистые, структурированные логи, что делает их проще для разбора инструментами вроде ELK, Grafana или Datadog. 👉@BookJava

Как масштабировать машинные модели и работать с огромными объемами данных? Откройте для себя возможности Spark ML на открытом
Как масштабировать машинные модели и работать с огромными объемами данных? Откройте для себя возможности Spark ML на открытом уроке от OTUS! Spark ML — это мощный инструмент для масштабируемого машинного обучения, который позволяет обучать модели на больших данных, не переходя на специализированные ML-системы. Мы покажем, как интеграция с Spark SQL и DataFrame API упрощает ETL-подготовку данных и фичуризацию для реальных проектов. Убедитесь, как Spark ML решает задачи отказоустойчивости и распределённых вычислений, позволяя вам легко строить промышленные ML-пайплайны. Посетите открытый урок 11 июня в 20:00 МСК в преддверие старта курса «Spark Developer» и получите скидку на обучение: https://vk.cc/cMyLJ3 Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576