Библиотека джависта | Java, Spring, Maven, Hibernate
23.4K subscribers
2.21K photos
47 videos
45 files
3.13K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://t.me/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
👀 Внутреннее устройство Map.computeIfAbsent()

computeIfAbsent() — это не просто «get или put». Это атомарная операция с ленивым вычислением, которая решает классическую проблему check-then-act в многопоточном коде.

📦 Что такое computeIfAbsent()

Поведение

1. Если ключ существует и value != null → вернуть value
2. Если ключа нет или value == null → вызвать mappingFunction
3. Результат функции put в map
4. Вернуть computed value

Классический use case:

//  Старый способ — race condition!
if (!map.containsKey(key)) {
map.put(key, expensiveOperation());
}

// Новый способ — атомарно
map.computeIfAbsent(key, k -> expensiveOperation());


🔍 Упрощённый код из JDK:

public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
if (mappingFunction == null)
throw new NullPointerException();

int hash = hash(key);
Node<K,V>[] tab = table;
Node<K,V> first = tab[index];

// Поиск существующего entry
if (first != null) {
Node<K,V> e = first;
do {
if (e.hash == hash &&
Objects.equals(key, e.key)) {
V v = e.value;
if (v != null) {
return v; // Найден, не вызываем функцию!
}
}
} while ((e = e.next) != null);
}

// Ключа нет — вызов mappingFunction
V newValue = mappingFunction.apply(key);

if (newValue != null) {
putVal(hash, key, newValue, true, true);
}

return newValue;
}


📊 Performance

Benchmark: 1M операций
// Старый способ: containsKey + put
if (!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
// Time: ~45ms, 2 hash lookups

// computeIfAbsent
map.computeIfAbsent(key, k -> new ArrayList<>());
// Time: ~30ms, 1 hash lookup

computeIfAbsent() на 33% быстрее!


Делайте

— Используйте для lazy initialization
— Используйте ConcurrentHashMap для thread-safety
— Держите mappingFunction быстрым и простым

Не делайте

— Не вызывайте computeIfAbsent рекурсивно на том же ключе
— Не модифицируйте map внутри mappingFunction
— Не возвращайте null если хотите кэшировать отсутствие
— Не используйте для побочных эффектов (только для вычисления value)

🔗 Документация

Ставьте 🔥, если интересны другие Map методы!

Бонусы для подписчиков:
Скидка 40% на все курсы Академии
Розыгрыш Apple MacBook
Бесплатный тест на знание математики

🐸 Библиотека джависта

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥74👍4👏1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Хочешь строить свои AI-модели, а не просто запускать чужие?

Proglib.academy открывает курс «Математика для разработки AI-моделей» — программу, которая превращает понимание ML из «черного ящика» в осознанную инженерную работу.

📌 Почему без математики в AI никуда:

→ Чтобы пройти собеседование. Это первый фильтр: линал, матстат, оптимизация — спрашивают везде.
→ Чтобы понимать процесс изнутри. Инженер AI должен понимать, почему и как работает модель, а не просто жать fit().

🎓 Что будет на курсе:

→ 3 практических задания на Python + финальный проект с разбором от специалистов;
→ программа обновлена в ноябре 2025;
→ за 2 месяца пройдёшь весь фундамент, нужный для работы с моделями;
→ преподаватели — гуру математики, методисты и исследователи из ВШЭ и индустрии.

🎁 Бонусы ноября:

— 40% скидка;
— получаешь курс «Школьная математика» в подарок;
— короткий тест и узнать свой уровень.

🔗 Подробнее о курсе
✔️ SQL-тест: Поиск дубликатов транзакций

Напишите запрос для production-базы 👇

📦 Задание

Есть таблица transactions с полями:

id — идентификатор
user_id — ID пользователя
amount — сумма транзакции
created_at — время создания

Найдите подозрительные дубликаты: транзакции одного пользователя с одинаковой суммой, созданные в течение 5 минут друг от друга.

📋 Требования

— Вывести: user_id, amount, количество дублей, временной диапазон
— Показать только группы с 2+ транзакциями
— Отсортировать по количеству дублей (DESC)

Ставьте → 🔥, если нравится формат. Если нет → 🤔

💬 Пишите решение в комментариях, главное прячьте под спойлер.

🐸 Библиотека собеса по Java

#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥172👍2
🎯 Магия IntelliJ IDEA: Stream Debugger

Дебажишь цепочку стримов из 5 операций? Breakpoint показывает только входную коллекцию. Чтобы понять, где отвалились элементы, приходится разбивать стрим на переменные или добавлять peek(System.out::println) и пересобирать.

А IDEA умеет дебажить Stream API пошагово с визуализацией данных на каждой операции.

🔹 Что делает

— Показывает данные после каждой операции в цепочке (map, filter, flatMap, etc.)
— Визуализирует, какие элементы прошли/отфильтровались на каждом шаге
— Поддерживает Flat Mode для flatMap — разворачивает вложенные стримы
— Работает с параллельными стримами, показывая распределение по потокам
— Не требует изменения кода — breakpoint на любом месте стрима

🔹 Зачем это нужно

— Понять, почему в результате нет ожидаемых элементов (на каком filter отвалились)
— Увидеть промежуточные трансформации данных в сложных map/flatMap
— Найти элемент, который вызывает exception в середине pipeline

🔹 Как использовать

— Поставить breakpoint на любой строке с Stream API
— При остановке: кнопка "Trace Current Stream Chain" в дебаггере (иконка с волнами)
— Откроется окно с визуализацией: каждая операция — своя колонка с данными
— Можно кликнуть на элемент и увидеть его трансформацию по всей цепочке
— Flat Mode: переключатель для flatMap — раскрывает вложенные коллекции

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥53
📘 4 декабря стартует набор на курс «Математика для разработки AI-моделей»

Если вы работаете с моделями или хотите перейти в DS/ML, декабрь — идеальный момент закрыть фундаментальные пробелы.

На курсе вы разберёте ключевые разделы, которые лежат в основе современных AI-моделей: линейная алгебра, анализ, оптимизация, математический анализ, вероятности, статистика. Всё через практику в Python.

В программе живые занятия с экспертами AI-индустрии (SberAI, ВШЭ, WB&Russ), разбор реальных задач, квизы и финальный проект.

🌐 Формат: онлайн + доступ к записям

🎁 Бонусы: курс «Школьная математика» в подарок, бесплатный тест по математике

После лекций будет разбор ваших решений и возможность задать вопросы преподавателям.

👉 Записаться на курс
🥱2
🔥 Как настроить Spring Cloud Config для централизованной конфигурации

Spring Cloud Config — это сервер конфигурации для распределённых систем. Централизованное хранение настроек, версионирование через Git, динамическое обновление без рестарта.

Поддерживает profiles, encryption секретов, webhook для автообновления и fallback на локальную конфигурацию при недоступности сервера.

1️⃣ Добавляем зависимости для Config Server

Создайте отдельный Spring Boot проект для Config Server. Добавьте зависимости spring-cloud-config-server и spring-boot-starter-actuator.

Критически важно указать версию Spring Cloud через dependencyManagement. Для Spring Boot 3.x используйте Spring Cloud 2022.x. Несовместимость версий приведёт к runtime ошибкам.

2️⃣ Настраиваем Config Server

Аннотируйте главный класс через @EnableConfigServer. В application.yml укажите spring.cloud.config.server.git.uri с путём к Git репозиторию конфигураций.

Настройте search-paths для структуры директорий: /{application} или /{application}/{profile}. Добавьте username/password для приватных репозиториев. Используйте clone-on-start=true для проверки доступности репо при старте.

3️⃣ Организуем структуру конфигураций в Git

Создайте Git репо с файлами конфигураций. Именование: {application}-{profile}.yml. Например: user-service-dev.yml, user-service-prod.yml.

Общие настройки кладите в application.yml — они применяются ко всем сервисам. Специфичные настройки в application-{profile}.yml. Config Server мержит конфигурации в правильном порядке приоритета.

4️⃣ Настраиваем Config Client в сервисах

В микросервисах добавьте зависимость spring-cloud-starter-config. Создайте bootstrap.yml (или application.yml) с параметрами для подключения к Config Server.

Укажите spring.application.name (имя сервиса для поиска конфигурации), spring.config.import=optional:configserver:http://config-server:8888, spring.cloud.config.fail-fast=false для graceful degradation.

5️⃣ Реализуем динамическое обновление конфигурации

Аннотируйте beans через @RefreshScope для пересоздания при обновлении конфигурации. Они будут уничтожены и созданы заново с новыми значениями из Config Server.

Отправляйте POST запрос на /actuator/refresh для обновления конфигурации в runtime. Для обновления всех инстансов используйте Spring Cloud Bus с RabbitMQ/Kafka — один запрос обновит все микросервисы.

6️⃣ Настраиваем шифрование секретов

Настройте encrypt.key в Config Server для симметричного шифрования или используйте keystore для asymmetric encryption. Шифруйте секреты через POST /encrypt endpoint.

В конфигах храните зашифрованные значения с префиксом {cipher}: password: '{cipher}AQBzQoXWeF...'. Config Server автоматически расшифрует при запросе от клиента. Ключ шифрования храните в environment variables.

7️⃣ Высокая доступность и наблюдение

▪️ Запускайте несколько экземпляров сервера настроек за load balancer'ом
▪️ Настройте параметры retry и timeout в клиентах на случай недоступности сервера
▪️ Включите actuator endpoints для мониторинга Config Server
▪️ Кэшируйте настройки на клиенте через встроенное кэширование spring-cloud-config-client

✔️ Что происходит под капотом

При старте Config Client делает HTTP запрос к Config Server с именем приложения и профилем. Config Server клонирует Git репо (или использует кеш), ищет файлы по pattern, парсит YAML/properties.

Конфигурации мержатся по приоритету (profile > application > default), секреты расшифровываются. Config Server возвращает JSON со всеми property sources. Client применяет их в Spring Environment с высоким приоритетом.

💡 Бонус-совет

Используйте Vault Backend вместо Git для критичных секретов. Spring Cloud Config поддерживает HashiCorp Vault как backend для конфигурации. Vault обеспечивает динамические секреты, audit logging, fine-grained access control. Настройте через spring.cloud.config.server.vault.

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥3👏1
This media is not supported in your browser
VIEW IN TELEGRAM
VK RecSys Challenge: проверьте свой алгоритм в деле!

В самом разгаре ежегодное соревнование по разработке рекомендательных систем от VK — RecSys Challenge 2025. Участникам предстоит решить одну из самых сложных проблем в мире рекомендаций: задачу холодного старта.

Суть соревнования — построить модель, которая предскажет, кому из пользователей понравится новый клип, даже если его ещё никто не видел.

Что ждёт участников:
• Реальные данные — датасет VK-LSVD с 40 млрд взаимодействий и 20 млн коротких видео
• Можно участвовать соло или в команде до 4 человек
• Техническая свобода — до 5 сабмитов в день, возможность экспериментировать
• Общий призовой фонд — 2 500 000 рублей

Приглашают студентов, исследователей, ML-инженеров — всех, кто хочет испытать свои силы на реальных данных и создать алгоритм, который работает в условиях, максимально приближенных к контентной жизни.

Регистрация открыта до 15 декабря. Успейте подать заявку, скачать датасет и начать эксперименты!

👉 Подробности и регистрация на сайте
🔍Тестовое собеседование с ТехЛидом из МТС уже завтра

3 декабря(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Илья Аров, старший разработчик в МТС, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Илье

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Обратная связь

Какая рубрика нравится больше? Если забыли, о чём рубрика, можно освежить в памяти тут.

🔥#CoreJava
👍🏼#Enterprise
👾#DevLife
🤔#News
❤️ → Всё нравится :))

🐸 Библиотека джависта

#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍7🔥4👾2