TGViewer
Channel Public Channel
Библиотека джависта | Java, Spring, Maven, Hibernate

Библиотека джависта | Java, Spring, Maven, Hibernate

@javaproglib

Все самое полезное для Java-разработчика в одном канале.

Учиться у нас: clc.to/AATM8w

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

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Subscribers
22K
Photos
2.5K
Videos
57
Links
3.7K
Recent Posts 16 shown
Post #7878 870
🧠 Почему a.age() - b.age() может сломать сортировку

Часто встречается такой Comparator:


list.sort((a, b) -> a.age() - b.age());


Проблема — переполнение int.

🔴 Например:


Integer.MIN_VALUE - 1
// Integer.MAX_VALUE


Из-за этого компаратор может вернуть неправильный знак, и сортировка нарушит порядок.

🔴 Надёжнее:


list.sort(Comparator.comparingInt(User::age));


🔴 А если нужна дополнительная сортировка:


list.sort(
Comparator.comparingInt(User::age)
.thenComparing(User::name)
);


📌 Для сравнения чисел используйте comparingInt, comparingLong или comparingDouble, а не ручное вычитание.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • 👍 7
  • ❤ 1
Post #7877 1.15K
🤯 Collectors.teeing — две агрегации в одном collect

Нужно получить средний возраст и количество пользователей?

🟡 Вместо ручной логики можно объединить два коллектора:


record Stats(double avg, long count) {}

Stats stats = users.stream().collect(
Collectors.teeing(
Collectors.averagingInt(User::age),
Collectors.counting(),
Stats::new
)
);


🟡 teeing передаёт элементы двум коллекторам, а затем объединяет их результаты вашей функцией.

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

Доступен с Java 12.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • 👍 9
  • ❤ 3
Post #7871 1.56K
⚡️⚡️Joker 2026: что происходит с профессией разработчика

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

Поэтому в этом сезоне меняется и Joker: первый день традиционно посвящен Java — Core Java, рантайму и работе на уровне железа. А во второй день будем обсуждать, как прямо сейчас меняется сама инженерная практика.

В программе — Context Engineering, команды из людей и ИИ-агентов, Self-Evolving Agents, новые подходы к архитектуре и работе с моделями, а также вопросы ответственности и роли эксперта.

Собрали главные темы второго дня в карточках.

🌟С промокодом: javaproglib персональные билеты дешевле

Полное расписание и билеты — на сайте.
  • 🔥 5
  • 🌚 3
  • ❤ 2
  • 🥱 1
Post #7865 1.45K
🧠 Что выведет код?

❤️ [1, 2, 3, 4]
🔥 [2, 4]
👍 [1, 3]
👾 ConcurrentModificationException

👇 Правильный ответ (нажми, чтобы прочитать):

[1, 3] — `removeIf` удаляет элементы, которые подходят под условие:

чётные `2` и `4` исчезают, остаются `1` и `3`.

Метод предназначен для удаления элементов по условию без ручного изменения списка внутри `for-each`.

⚠️ Ловушка:

Если написать так:

var list = List.of(1, 2, 3, 4);
list.removeIf(x -> x % 2 == 0);

получим `UnsupportedOperationException`.

`List.of()` создаёт неизменяемый список, а `removeIf` меняет коллекцию.


══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • 👍 35
  • ❤ 5
  • 🔥 1
Post #7864 1.48K
🛠 computeIfAbsent — кэш и группировка без if

Нужно положить значение в список по ключу. Обычно пишут так:


if (!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
map.get(key).add(value);


С `computeIfAbsent` короче:


map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);


Если ключ отсутствует или связан с null, будет создан список. Затем в него добавится значение.

Удобно для:

— группировки данных;
— создания коллекций по ключу;
— простых кэшей.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • 👍 4
  • 🔥 3
Post #7863 1.4K
Как правильно определять границы сервисов в микросервисной архитектуре?

Один из недооценённых скиллов в разработке — это умение провести правильную границу между сервисами. Большинство «распределённых монолитов», которые мы встречаем в продакшене, рождаются именно здесь.

🟡 Что такое Service Boundary

Это контракт на три вещи:

— за что сервис отвечает;
— какими данными он владеет;
— как он общается с соседями.


Представь компанию: HR не лезет в финансы, а склад не занимается зарплатами. Так же должны работать твои сервисы.

🟡 4 принципа, которые работают

1. Business Capability First

Режь по бизнес-функциям, а не по техническим слоям. OrderService, PaymentService, UserService, потому что именно так бизнес думает о системе.

2. Single Responsibility

Один сервис — одна ответственность. Если в описании сервиса есть союз и, это уже тревожный звоночек 🚨

3. Data Ownership

У каждого сервиса своя БД. Без исключений. Shared database = shared pain.

4. Loose Coupling

Только API, никакого прямого доступа к чужим таблицам.

🟡 Классический антипаттерн


// ❌ Бизнес-логика смешана в одном сервисе
@Service
public class BadOrderService {
public String processOrderAndPayment(int id) {
String order = orderRepository.findById(id)
.orElse("Order not found");
String paymentStatus = "Payment Successful"; // 🚨 чужая ответственность
return order + " | " + paymentStatus;
}
}


Выглядит безобидно, пока не нужно масштабировать платежи отдельно, сменить платёжного провайдера или добавить retry-логику только для оплаты. Тут и начнутся реальные проблемы.

🟡 Советы из практики

Начни с монолита. Не дроби систему заранее. Сначала пойми домен, потом режь по швам.
Следи за chatty communication. Если сервис делает 10 вызовов к соседям на каждый запрос, граница явно проведена не там.
Изучи DDD. Bounded Context из Domain-Driven Design это лучший инструмент для поиска правильных границ. Инвестиция окупается быстро


══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • 👍 8
  • ❤‍🔥 3
  • 🔥 3
  • ❤ 1
Post #7862 1.46K
😭 Как не потратить недельный лимит AI-кодинга за три дня?

Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.

🔘 Поговорим о том:

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

✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.

⬇️ 17 сентября, 19:00 МСК
⬇️ 1,5 часа · бесплатно
⬇️ Арсений Харланов и Олег Лайок

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

🔗 Зарегистрироваться на вебинар⁠
  • 👍 1
  • 🥱 1
Post #7861 1.71K
🤔 Вопрос с собеседования

Что выведет код?

❤️ — 1
🔥 — 2
👍 — ошибка компиляции

👇 Правильный ответ (нажми, чтобы прочитать):

2

return в try вычисляет значение, но перед фактическим выходом из метода выполняется finally.
return 2 из finally заменяет результат из try.

⚠️ На практике так делать не стоит: return в finally может скрыть исключение или изменить ожидаемый результат метода.


══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • 🔥 35
  • 👍 5
  • ❤ 3
Post #7860 1.72K
А вы уже забрали свой подарок ко Дню программиста?

Мы в Tproger вместе с нашими друзьями собрали целую коробку подарков к вашему профессиональному празднику. Переходите по ссылке, трясите коробку и забирайте свой презент: https://tprg.ru/3j14
Post #7858 1.65K
🌸 Вселенная намекает: пора уже начать этот курс

С 14 сентября цены в Proglib Academy вырастут на 20% 👀

Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц 😏

📍 Выбрать курс
Post #7857 1.73K
🤯 Objects.requireNonNullElse вместо тернарника

Когда нужно подставить значение, если переменная null:


// было
String result = (name != null) ? name : "Гость";

// стало
String result = Objects.requireNonNullElse(name, "Гость");


🔴 А если значение по умолчанию дорого вычислять — используйте ленивый вариант:


Objects.requireNonNullElseGet(
name,
() -> loadDefault()
);


🔴 Главное различие:

requireNonNullElse — дефолтное значение уже вычислено.
requireNonNullElseGet — Supplier вызывается только при null.

Оба метода есть в java.util.Objects начиная с Java 9.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • 👍 16
Post #7856 1.63K
🌞 Готовим вебинар про AI в разработке и хотим сделать его максимально полезным

Что реально хочется разобрать? Где чаще всего застреваете? Что пробовали, но так и не получилось нормально внедрить?


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

Задавайте всё, что давно хотелось спросить 📍

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • 🥱 2
  • ❤ 1
Post #7855 1.85K
🥊 Spring Boot 4 vs Quarkus — что выбрать в 2026?

Оба подходят для микросервисов на Java, но оптимизируют разные вещи.

🔴 Quarkus
→ больше работы переносит на build time;
→ быстрый старт и низкое потребление памяти;
→ особенно интересен для serverless и native image.


🔴 Spring Boot 4
→ огромная экосистема Spring;
→ привычный стек и высокая скорость разработки;
→ больше возможностей подключить готовые решения без смены подхода.


По производительности нельзя просто объявить победителя: важны workload, JVM/native mode, настройки и конкретные бенчмарки.

А что выберете для нового микросервиса?

❤️ Spring Boot 4
👍 Quarkus
🤩 Micronaut / Helidon
🌚 Зависит от проекта

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • ❤ 51
  • 🌚 12
  • 👍 7
Post #7854 2.04K
🛠 groupingBy: собрать Map из списка

🟡 Нужно разложить пользователей по городам?


Map<String, List<User>> byCity = users.stream()
.collect(Collectors.groupingBy(User::city));


🟡 Нужны не пользователи, а количество?


Map<String, Long> counts = users.stream()
.collect(Collectors.groupingBy(
User::city,
Collectors.counting()
));


🟡 А дальше можно комбинировать коллекторы:


Collectors.mapping(...)
Collectors.averagingInt(...)
Collectors.summingInt(…)


groupingBy — один из тех инструментов Stream API, который раскрывается именно через комбинацию коллекторов, а не в простом groupingBy(...).

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта
  • ❤ 5
  • 👍 1
  • 🔥 1
Older posts →

About this channel

How can I read @javaproglib without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Библиотека джависта | Java, Spring, Maven, Hibernate: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Библиотека джависта | Java, Spring, Maven, Hibernate have?
Библиотека джависта | Java, Spring, Maven, Hibernate (@javaproglib) has 22K subscribers on Telegram, refreshed roughly every 30 minutes.
Does Библиотека джависта | Java, Spring, Maven, Hibernate know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →