Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

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

Обратная связь: @proglibrary_feedback_bot

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
🖥 Фидбэк vs токсичность: как давать обратную связь коллегам и начальству

Задумывались ли вы, как превратить обратную связь из источника стресса в инструмент роста? Ведь неудачно сказанное слово может подорвать доверие в команде, тогда как конструктивный фидбэк способен вдохновить на новые достижения. Важно не только что мы говорим, но и как мы это делаем.

🔗 Подробнее в статье
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Maven vs Gradle

🔹 Maven — это инструмент сборки, использующий XML-конфигурацию (pom.xml). Популярен в Java-мире и часто применяется в корпоративных проектах.

✔️ Преимущества

— Чёткая структура проекта и стандартизация.
— Огромное количество доступных плагинов.
— Репозитории (Maven Central) делают управление зависимостями удобным.

Недостатки

— XML-файлы могут раздуваться и становиться громоздкими.
— Скорость сборки ниже по сравнению с Gradle.
— Сложнее писать кастомные задачи (Goals).

🔹 Gradle — современный инструмент сборки, использующий декларативный стиль (build.gradle.kts или build.gradle). Часто применяется в Android-разработке и для микросервисов.

✔️ Преимущества

— Поддерживает Groovy и Kotlin DSL.
— Более быстрая сборка благодаря инкрементальному билду и кэшированию.
— Меньше кода в конфигурации по сравнению с Maven.

Недостатки

— Меньше стандартов, возможна путаница с конфигурацией.
— Выше порог вхождения, особенно если переходите с Maven.
— Может быть сложнее отлаживать проблемы со сборкой.

👍🏼 — Maven, 🔥 — Gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
Найти работу теперь так же просто, как заказать такси 🚗

Представь, что поиск работы стал таким же удобным, как вызов такси.

1️⃣ Регистрируешься за 2 минуты
2️⃣ Проходишь AI-интервью в любое время
3️⃣ Получаешь персональные вакансии и пре-офер от Сбера

💡 Без стресса, без ожидания, без звонков "через недельку" – просто бери и делай!

🔗 Попробуй прямо сейчас! 👉 https://clc.to/GkOTTA

Реклама. ПАО СБЕРБАНК, ИНН 7707083893. Erid 2VtzqxUqFAv
В чем разница между map() и flatMap()?

Оба метода используются для трансформации данных в 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
🔼 Улучшаем работу с Optional

Все используют 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()).

⚠️ Плохие практики

▪️ Использовать Optional в качестве аргументов методов — это ломает читаемость API.
▪️ Использовать Optional.get() без проверки — это сводит всю пользу Optional на нет.
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 Почему увольнять программистов ради ИИ — путь к провалу

Мы разберем, почему компании, которые массово увольняют разработчиков в пользу ИИ, рискуют остаться у разбитого корыта. Сгенерированный код не умеет исправлять баги, а инженеры, которые действительно понимают систему, становятся редкостью и роскошью.

➡️ Что внутри статьи

▪️ Почему новые поколения программистов рискуют потерять ключевые навыки.

▪️ Как компании, заменившие инженеров ИИ, столкнутся с серьезными проблемами.

▪️ Почему опытные разработчики станут супердорогими и востребованными.

▪️ К чему приведет полная ставка на искусственный интеллект в IT.

🔵 Подтяните свои знания о машинном обучении вместе с нашим курсом «Базовые модели ML и приложения»

🔗 Читайте статью
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой AI-инструмент вы используете?

🔥 ChatGPT
👍🏼 DeepSeek
⚡️ GitHub Copilot
❤️ ЯндексГпт
👾 Я пишу код сам, без AI
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
WeakHashMap

WeakHashMap — это хеш-таблица, в которой ключи хранятся через слабые ссылки (WeakReference). Это значит, что если на ключ нет сильных ссылок, он становится кандидатом на удаление при следующем проходе GC.

🔹 Как работает GC с WeakHashMap

GC удаляет только ключи, на которые больше нет сильных ссылок. Значения же остаются в памяти, пока WeakHashMap не изменится (put(), remove()). Можно использовать ReferenceQueue, чтобы отслеживать удалённые ключи.

🔹 Когда используется


— Кеширование данных, которые можно безопасно сбрасывать.
— Хранение метаданных объектов без риска утечек памяти.
— Уменьшение давления на GC в высоконагруженных системах.

🔹 Отличие от HashMap

В HashMap ключ останется в памяти, пока его явно не удалят. В WeakHashMap ключ исчезнет автоматически, если на него нет ссылок.

⚠️ Когда НЕ стоит использовать

— Если кеш должен сохранять данные долго.
— Если ключи неизменяемые (String из пула строк, Integer), GC их не удалит.
— Если нужна предсказуемость хранения — WeakHashMap не гарантирует срок жизни ключей.

💬 Используете WeakHashMap в проде?
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Твоя БД скоро станет умнее тебя: 5 трендов open-source баз данных 2025

БД перестают быть просто хранилищем — теперь они оптимизируют запросы, автоматически анализируют данные и даже используют AI для прогнозов.
Какие фичи перевернут мир open-source БД в 2025? Узнайте в статье👇

🫢 Прочитать статью

🐸Библиотека devops'a
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Как устроен кеш в 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)
Please open Telegram to view this post
VIEW IN TELEGRAM
🧮🔠 Математика в действии: решаем хитрые задачи по прогнозированию, оптимизации и логике

Статья, которая поможет развить навыки решения задач с помощью математики.

➡️ Вот что вас ждет

1️⃣ Прогнозирование численности населения — используем цепи Маркова для предсказания миграций между городом и пригородами.

2️⃣ Минимизация затрат — находим минимальное скалярное произведение векторов для оптимального распределения задач между работниками.

3️⃣ Машина времени — решаем задачу максимального числа пересекающихся временных интервалов с помощью заметающей прямой.

4️⃣ Алгоритм Целлера — вычисляем день недели по дате. Проверка на практике.

🔵 Хочешь прокачаться в математике для ML? Тогда разбирайся с этими задачами и не упусти вебинар: «Математика для ML: от теории к практике».

👉 Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM