uz
Feedback

Firibgarlarga uchmang! Telemetrio bunday kanallarni topadi va belgilaydi 👉 Belgini ko‘rmoqchi bo‘lsangiz, obuna bo‘ling

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

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

Kanalga Telegram’da o‘tish

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

Ko'proq ko'rsatish
9 998
Obunachilar
-324 soatlar
-47 kun
-5930 kun
Postlar arxiv
Spring Data JDBC. Проблемы известные, проблемы неизвестные Михаил Поливаха Spring Data JDBC — относительно новый модуль Spring Data. У него своя концепция, свои фичи, свои баги и проблемы. Часть этих проблем известна аудитории и описана в документации. Однако иногда документация врет или недоговаривает. К тому же есть некоторые неочевидные детали реализации, которые могут смутить пользователей библиотеки. Это касается многих аспектов — от генерации SQL до маппинга сущностей. Во время доклада мы посмотрели на ряд подобных сюрпризов, обсудим, баг это или фича и что разработчики планируют с этим делать. Также рассмотрели текущее состояние проекта Spring Data JDBC — над чем идет работа, что исправляется, а что пока нет. источник 👉@BookJava

⚔️Ваши микросервисы не дружат между собой? Сначала один сервис завис, потом второй, а в логах — хаос. Конфиги разбросаны по р
⚔️Ваши микросервисы не дружат между собой? Сначала один сервис завис, потом второй, а в логах — хаос. Конфиги разбросаны по разным файлам, API ломаются после каждого релиза, а тестировщики смотрят на вас как на главного злодея проекта. 👩‍💻 Есть способ навести порядок. Spring Cloud помогает микросервисам работать как единая система: управлять конфигурациями, находить друг друга без лишних костылей и не падать при каждом обновлении. 🦾Разберём, как это сделать, на открытом уроке «Экосистема Spring Cloud». Когда: 25 февраля в 20:00 (мск). Вы узнаете, как использовать Service Discovery, API Gateway и Config Server. А еще получите скидку на большое обучение «Java Developer. Advanced». Не ждите, пока сервисы начнут воевать друг с другом. 🔗 Регистрируйтесь прямо сейчас: https://vk.cc/cIL61o Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🔥 Исключения в Java: что не так с catch (Exception e)? Давайте разберем одну из самых частых ошибок, которую я вижу в коде даже опытных Java-программистов. Это перехват всех исключений сразу:

try {
    // код, который может выбросить исключение
} catch (Exception e) {
    e.printStackTrace();
}
📌 В чем проблема? 1️⃣ Глушение ошибок – если просто печатать stacktrace, но не обрабатывать ошибку корректно, это может привести к неожиданным последствиям. Например, приложение продолжит работу в некорректном состоянии. 2️⃣ Ловим слишком много – перехватывая Exception, мы ловим все исключения, включая RuntimeException, что делает отладку сложнее. 3️⃣ Скрытые ошибки – если в коде, например, ошибка валидации и мы просто пишем e.printStackTrace(), пользователь так и не узнает, что пошло не так. 💡 Как делать правильно? Лучше перехватывать конкретные исключения и обрабатывать их осмысленно:

try {
    // код
} catch (IOException e) {
    log.error("Ошибка ввода-вывода", e);
} catch (NumberFormatException e) {
    log.warn("Некорректный формат числа", e);
} catch (Exception e) {
    log.error("Непредвиденная ошибка", e);
    throw e; // Не глушим ошибку, пробрасываем дальше
}
Вывод: Используйте catch (Exception e) только если действительно уверены, что вам нужно обработать все возможные ошибки. В остальных случаях — ловите конкретные исключения и работайте с ними правильно! 🚀 ❓ Как вы относитесь к catch (Exception e)? Часто ли видите его в коде? Давайте обсудим в комментариях! 💬 👉@BookJava

👩‍💻 Resilience4j. RateLimiter Приглашаем на открытый урок. 🗓 24 февраля в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта кур
👩‍💻 Resilience4j. RateLimiter Приглашаем на открытый урок. 🗓 24 февраля в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса«Java Developer. Professional». Где мы разберем: ✔️Что такое RateLimiter? ✔️Настройка и особенности. Урок будет полезен тем, кто хочет: ✔️Защитить приложения от пиковых нагрузок и обеспечить высокую доступность. ✔️Использовать ключевые инструменты Resilience4j для управления трафиком. ✔️Глубже понять, как писать надёжные микросервисы и оптимизировать их под реальные сценарии. В результате урока вы: ✔️Разберётесь, как работает RateLimiter и в чём его польза при ограничении запросов. ✔️Получите несколько примеров настройки и сможете применять эти приёмы в базовых сценариях. Спикер Сергей Петрелевич — опытный Java/Kotlin-разработчик и преподаватель. 🔗 Ссылка на регистрацию: https://vk.cc/cIJZkN Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

📌 Паттерны проектирования: Декоратор в Java Привет, друзья! Сегодня я хочу разобрать с вами один из самых полезных и часто применяемых паттернов проектирования — Декоратор. 🚀 Когда его использовать? Когда нужно динамически добавлять функциональность объекту без изменения его кода. Это альтернатива наследованию, но более гибкая и мощная. 🔍 Пример из жизни Представьте, что у нас есть базовый интерфейс Notifier, который отправляет сообщения. По умолчанию он умеет слать только e-mail уведомления. Но нам нужно добавить поддержку SMS и пуш-уведомлений. Вместо того чтобы создавать кучу подклассов, мы используем Декоратор:

// Базовый интерфейс
interface Notifier {
    void send(String message);
}

// Основная реализация
class EmailNotifier implements Notifier {
    @Override
    public void send(String message) {
        System.out.println("Отправка email: " + message);
    }
}

// Базовый декоратор
class NotifierDecorator implements Notifier {
    protected Notifier notifier;

    public NotifierDecorator(Notifier notifier) {
        this.notifier = notifier;
    }

    @Override
    public void send(String message) {
        notifier.send(message);
    }
}

// Декоратор для SMS
class SMSNotifier extends NotifierDecorator {
    public SMSNotifier(Notifier notifier) {
        super(notifier);
    }

    @Override
    public void send(String message) {
        super.send(message);
        System.out.println("Отправка SMS: " + message);
    }
}

// Декоратор для Push-уведомлений
class PushNotifier extends NotifierDecorator {
    public PushNotifier(Notifier notifier) {
        super(notifier);
    }

    @Override
    public void send(String message) {
        super.send(message);
        System.out.println("Отправка Push-уведомления: " + message);
    }
}

// Использование
public class Main {
    public static void main(String[] args) {
        Notifier notifier = new EmailNotifier();
        notifier = new SMSNotifier(notifier);
        notifier = new PushNotifier(notifier);

        notifier.send("Важное сообщение!");
    }
}
🔥 Выход в консоль:
Отправка email: Важное сообщение!
Отправка SMS: Важное сообщение!
Отправка Push-уведомления: Важное сообщение!
✅ Преимущества: ✔️ Гибкость: можно комбинировать декораторы в любом порядке ✔️ Принцип открытости/закрытости (OCP) — код легко расширяется ✔️ Разделение обязанностей — каждая часть отвечает за свою функцию Использовали ли вы Декоратор в своих проектах? Делитесь своим опытом в комментариях! ⬇️ 👉@BookJava

А всё, а раньше надо было! Именно это скажут вам потерянные данные, когда из Кафки они превратятся в кашку. Лучше разбираться
А всё, а раньше надо было! Именно это скажут вам потерянные данные, когда из Кафки они превратятся в кашку. Лучше разбираться в инструменте до того, как начнёшь с ним работать по-серьёзному — не только в теории, но и на практике. Пока все данные на месте, приходите на «Apache Kafka для разработчиков»: ➡️ Разберётесь в основах Kafka, её архитектуре и бизнес-процессах. ➡️ Научитесь работать с системами, передающими и получающими большие объёмы сообщений. ➡️ Подготовитесь к базовым собеседованиям на позиции, связанные с Kafka. Углубленный курс с практикой на Java, Docker и Postgres. ▶️Занять место — по ссылке  #реклама О рекламодателе

Работа с временными метками в Java: что нужно знать? Всем раннего утра! 👋 Сегодня разберём важную тему — работу с временными метками в Java. Это может пригодиться при логировании, кэшировании, обработке данных и даже в повседневных задачах. 1. Получение текущей временной метки В Java с появлением java.time всё стало проще. Самый удобный способ получить timestamp:

Instant instant = Instant.now();
long timestamp = instant.toEpochMilli(); // В миллисекундах
Значение timestamp соответствует количеству миллисекунд, прошедших с 1 января 1970 года (UTC). 2. Преобразование timestamp в дату и время Допустим, у нас есть временная метка, и нам нужно преобразовать её в локальное время:

long timestamp = 1700000000000L; // Пример временной метки
Instant instant = Instant.ofEpochMilli(timestamp);
ZonedDateTime dateTime = instant.atZone(ZoneId.systemDefault());
System.out.println(dateTime);
Так можно легко получить читабельную дату. 3. Разница между датами Вычислить разницу между двумя временными метками можно так:

Instant start = Instant.now();
Thread.sleep(2000); // Эмуляция задержки
Instant end = Instant.now();

Duration duration = Duration.between(start, end);
System.out.println("Разница в секундах: " + duration.getSeconds());
Отличный способ измерять производительность кода! 4. Форматирование и вывод даты Для вывода даты в удобочитаемом формате используем DateTimeFormatter:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
String formatted = dateTime.format(formatter);
System.out.println(formatted);
Итог Работа с временными метками в Java теперь проще, чем когда-либо. Используйте Instant, Duration и DateTimeFormatter для удобного управления временем. 👉@BookJava

💡Совет: по умолчанию ленивую загрузку в @Hibernate можно использовать только для отношений, но не для простых (базовых) атри
💡Совет: по умолчанию ленивую загрузку в @Hibernate можно использовать только для отношений, но не для простых (базовых) атрибутов. Чтобы она работала и для полей, необходимо использовать байткод-энхансмент через плагин. В этом случае поля, отмеченные как lazy, будут загружаться при первом обращении к ним. #Java #JPA 👉@BookJava

Что спрашивают на собеседовании у Middle Java-разработчика? Уже завтра, 19 февраля в 19:00 мск — бесплатное открытое собеседо
Что спрашивают на собеседовании у Middle Java-разработчика? Уже завтра, 19 февраля в 19:00 мск — бесплатное открытое собеседование в прямом эфире! Интервьюер Илья Аров с опытом работы в крупных банках задаст реальные вопросы разработчику-добровольцу и разберёт его ответы. В конце — время вопросов ментору из зала. Что узнаешь на эфире: ✅ Какие вопросы задают на собеседованиях и зачем ✅ Как подготовиться, чтобы получить достойный оффер ✅ Чего ждут от кандидатов на Middle Java Запишись на эфир в боте ШОРТКАТ → @shortcut_sh_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqw2cVob

Костыль в JDK и сортировка списков Говорить об архитектуре и разработке приятно, но ещё полезнее разбирать конкретные примеры. Давайте рассмотрим метод сортировки в Java и разберёмся, почему он устроен именно так. Если задать вопрос питонисту, он без колебаний выберет list.sort(), ведь в Python это стандартный метод списка. В Java ситуация иная. Класс Integer реализует интерфейс Comparable, и сортировка чисел — базовая операция для любого языка программирования. Логично было бы ожидать метод sort() в List, но его там нет. Вместо этого есть:

void sort(Comparator<? super E> c) { ... }
Чтобы просто отсортировать список чисел, приходится писать:

list.sort(Comparator.naturalOrder());
На первый взгляд, это выглядит как костыль. Под капотом Comparator.naturalOrder() тривиален:

(c1, c2) -> c1.compareTo(c2)
Так почему же нельзя просто вызвать list.sort() без компаратора? Разбираемся! Обратная совместимость — главная ценность Java Java создавалась для крупных долгоживущих систем, где стабильность важнее удобства. В JDK с начала 2000-х существует статический метод:

Collections.sort(List<T> list)
Этот метод изменяет переданный список, что сейчас считается плохой практикой, но тогда было нормой. В корпоративных системах часто расширяли стандартные коллекции и добавляли удобные методы, например:

CustomList sorted = list.sort();
Со временем стало очевидно, что экземплярные методы сортировки удобнее. Однако просто добавить default void sort() в List нельзя. Проблема с существующими реализациями Допустим, в проекте есть кастомный список:

public class CustomList implements List<T> {
    public CustomList sort() { ... }
}
Если бы в Java 8 добавили:

default void sort() { ... }
то компилятор не смог бы корректно обработать конфликт сигнатур (CustomList.sort() возвращает CustomList, а List.sort() — void`). Код, использующий `CustomList, перестал бы компилироваться. В результате многие проекты получили бы неожиданные проблемы, а пользователи — головную боль. Чтобы избежать этого, разработчики JDK не добавили sort() в List, а оставили только sort(Comparator), так как он использовался редко. Stream API и Kotlin В Stream API нет таких проблем с совместимостью, поэтому для стримов есть метод:

list = list.stream().sorted().toList();
А в Kotlin вообще есть удобный метод sorted(), соответствующий функциональному стилю. Как правильно сортировать список в Java Теперь можно ответить на главный вопрос: ✅ list.sort(Comparator.naturalOrder()); ✅ list = list.stream().sorted().toList(); Если вам нравится list.sort(), значит у вас хороший вкус на API. К сожалению, у Java свои исторические особенности, поэтому этот метод отсутствует в JDK. 👉@BookJava

🚀 5 полезных библиотек для Java-разработчика 🔹 Lombok – убирает бойлерплейт-код. Автоматически генерирует геттеры, сеттеры, конструкторы, toString(), equals(), hashCode(). Больше не нужно писать однотипный код вручную! 🔹 Guava – коллекции, кэширование, строки, примитивные типы, функциональные утилиты и многое другое. Разработана Google, широко используется в индустрии. 🔹 Apache Commons – набор утилит для работы со строками, коллекциями, потоками, датами. Позволяет сократить код и улучшить его читаемость. 🔹 Jackson – одна из лучших библиотек для работы с JSON. Позволяет сериализовать и десериализовать Java-объекты быстро и без лишнего кода. 🔹 Junit + Mockito – тестирование в Java. JUnit – основной инструмент для написания юнит-тестов, а Mockito помогает мокировать зависимости и тестировать сложные сценарии. 👉@BookJava

🚀 Apache Kafka и Spring — лучшие друзья микросервисов! Хотите узнать, почему? На открытом уроке мы покажем, как объединить K
🚀 Apache Kafka и Spring — лучшие друзья микросервисов! Хотите узнать, почему? На открытом уроке мы покажем, как объединить Kafka и Spring Framework для создания масштабируемых и надежных систем. В теории и практике! 🔍 Вы научитесь: - Настраивать асинхронное взаимодействие - Обрабатывать сообщения в реальном времени - Использовать инструменты мониторинга для оптимизации работы микросервисов 🗓 Занятие пройдет 18 февраля в 20:00 МСК и будет приурочено к старту курса «Apache Kafka». После урока вы сможете продолжить обучение по специальной цене и даже в рассрочку! 👉 Забронируйте свое место на открытом уроке! Пройдите короткий тест и получите запись: https://vk.cc/cIGdPJ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

📌 Паттерн "Одиночка" (Singleton) – когда и как правильно использовать? 👋 Сегодня хочу поговорить о Singleton – одном из самых популярных (и часто злоупотребляемых) паттернов в Java. 🔥 Что такое Singleton? Singleton гарантирует, что у класса будет только один экземпляр и предоставляет глобальную точку доступа к нему. Пример классического Singleton:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
Здесь используется жадная инициализация – объект создаётся сразу при загрузке класса. 💣 Проблемы Singleton 1️⃣ Нарушение SRP (Single Responsibility Principle) – Singleton управляет своим жизненным циклом. 2️⃣ Проблемы с тестированием – сложность мокирования в юнит-тестах. 3️⃣ Глобальное состояние – сложнее поддерживать код, возможны неожиданные баги. ✅ Когда использовать Singleton? ✔ Если требуется единый точный экземпляр (например, пул соединений, логгер). ✔ Если объект дорого создавать и его состояние неизменно. ✔ Когда глобальная точка доступа действительно оправдана. 🔧 Альтернативы 👉 Dependency Injection (DI) – лучше передавать объект через конструктор. 👉 Enum Singleton – лучший способ создать потокобезопасный Singleton:

public enum SingletonEnum {
    INSTANCE;

    public void someMethod() {
        System.out.println("Работаем!");
    }
}
Он защищён от сериализации и reflection-атак! 🚀 👉@BookJava

🚀 Разбираемся с var в Java: Когда использовать, а когда нет? Сегодня разберёмся с var в Java. Этот локальный тип вывода переменной появился в Java 10 и сразу вызвал много споров. Давайте посмотрим, когда его стоит использовать, а когда лучше отказаться. ✅ Когда var полезен? 1️⃣ Сокращение шаблонного кода

   var list = new ArrayList<String>(); // читается проще
   
2️⃣ Улучшает читаемость при длинных объявлениях

   var map = new HashMap<String, List<Integer>>();
   
3️⃣ Хорош при использовании анонимных классов

   var thread = new Thread(() -> System.out.println("Hello"));
   
4️⃣ Идеален для итераторов

   for (var entry : map.entrySet()) {
       System.out.println(entry.getKey() + " -> " + entry.getValue());
   }
   
❌ Когда var ухудшает код? 1️⃣ Неочевидный тип данных

   var data = fetchData(); // Что вернет метод? Интуитивно непонятно!
   
2️⃣ Снижение читаемости сложного кода

   var something = doSomethingComplicated(); // А что это такое?
   
3️⃣ Не подходит для публичных API Если метод возвращает var, мы теряем контракт с пользователем API. 🔥 Итог Используйте var, когда тип очевиден и код становится чище. Не злоупотребляйте им, чтобы не терять читаемость! 📌26 рекомендаций по использованию типа var в Java https://habr.com/ru/articles/438206/ https://dzone.com/articles/var-work-in-progress 👉@BookJava

Блокировки в HotSpot JVM Java Virtual Machine (JVM) — это промежуточное звено между скомпилированным Java-кодом и операционной системой (ОС). Благодаря этому механизму Java-приложения можно запускать на разных платформах без модификаций. Существует множество реализаций JVM, но наиболее популярной является HotSpot, входящая в состав OpenJDK. Однако JVM не просто транслирует Java-код в инструкции ОС. Она включает в себя множество оптимизаций, позволяющих исполнять код быстрее и эффективнее. Одна из таких оптимизаций касается механизма блокировок (synchronization locks). Виды блокировок в HotSpot Виртуальная машина HotSpot использует три вида блокировок в зависимости от уровня конкуренции между потоками: 1️⃣ Fat Lock (Inflated Lock) — классическая блокировка на основе мониторов объектов (mutexes). Этот метод используется, когда большое количество потоков одновременно пытаются захватить блокировку. 2️⃣ Thin Lock (Deflated Lock) — облегчённая блокировка, использующая атомарные CAS-операции (Compare-And-Swap). Такой подход быстрее мьютексов, но становится неэффективным при высоком уровне конкуренции, поскольку требует эксклюзивного доступа. 3️⃣ Biased Lock — предвзятая блокировка, предназначенная для сценариев, в которых объект используется одним и тем же потоком. При первом взаимодействии объект привязывается к потоку, и последующие операции с ним выполняются без затрат на синхронизацию. Однако, если другой поток попытается захватить блокировку, произойдёт глобальная аннулирование (bulk revocation), что может привести к значительным накладным расходам. > Важно! Biased Lock по умолчанию отключён при запуске JVM, поскольку на старте приложения активно взаимодействуют множество потоков. Через некоторое время он автоматически включается и становится основной стратегией блокировки. Тонкая настройка JVM JVM позволяет управлять стратегией блокировок с помощью следующих параметров: - Отключение Biased Lock

  -XX:-UseBiasedLocking
  
- Регулировка времени включения Biased Lock (по умолчанию 4 сек)

  -XX:BiasedLockingStartupDelay=500
  
Здесь 500 указывает задержку в миллисекундах. Когда настраивать блокировки вручную? В большинстве приложений не требуется изменять эти параметры, так как JVM автоматически выбирает оптимальные стратегии. Однако в высоконагруженных сценариях, например в паттерне Producer-Consumer, правильная настройка блокировок может значительно повысить производительность. Если ваше приложение испытывает проблемы с блокировками, профилирование с помощью JVM TI, JFR (Java Flight Recorder) или perf поможет выявить узкие места и подобрать наиболее подходящий метод синхронизации. 👉@BookJava

Совет Spring Framework💡 Вы можете автосопрягать несколько бинов, реализующих определенный интерфейс, в список, содержащий вс
Совет Spring Framework💡 Вы можете автосопрягать несколько бинов, реализующих определенный интерфейс, в список, содержащий все реализации. Определите список с общим типом, который вы хотите использовать. Вы можете использовать инъекцию конструктора, как показано на картинке, или инъекцию поля. 👉@BookJava

📌 Java Record: Почему Это Круто? Сегодня расскажу вам о record в Java – мощном инструменте, который упростит вашу жизнь при работе с неизменяемыми объектами. 🔹 Что такое record? Введённый в Java 14, record – это специальный тип класса, предназначенный для хранения данных. Он автоматически генерирует: ✅ Конструктор ✅ Геттеры (но без get в названии) ✅ equals(), hashCode(), toString() 🔹 Пример использования

public record User(String name, int age) {}
Этот код эквивалентен написанию полноценного класса с полями, конструктором, геттерами и методами equals/hashCode/toString, но занимает всего одну строку! 🔹 Преимущества record 🚀 Меньше кода – никаких бойлерплейтов 🚀 Иммутабельность – данные не изменяются после создания 🚀 Читаемость – сразу видно, что это объект только для хранения данных 🔹 Ограничения: ❗ Поля record всегда final ❗ Наследование от record запрещено 👉@BookJava

📌 Record vs Class в Java – когда что использовать? 👋 Сегодня разберёмся с record и class в Java. Когда лучше использовать record, а когда стоит остаться на классах? 🧐 Что такое record? Record — это специальный тип класса, предназначенный для хранения неизменяемых данных. Он автоматически генерирует: ✅ Конструктор, принимающий все поля ✅ toString(), equals(), hashCode() ✅ Методы доступа (`getter'ы`) 📌 Пример использования Record:

public record User(String name, int age) {}
🔥 Это равнозначно следующему классу:

public final class User {
    private final String name;
    private final int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String name() { return name; }
    public int age() { return age; }

    @Override
    public boolean equals(Object o) { /* реализация */ }
    @Override
    public int hashCode() { /* реализация */ }
    @Override
    public String toString() { /* реализация */ }
}
🏆 Когда использовать record? ✔️ Когда у вас неизменяемые (immutable) объекты ✔️ Когда вам нужны только данные без логики ✔️ Когда хочется избежать бойлерплейта ⛔ Когда НЕ стоит использовать record? 🚫 Если нужно наследование (record не поддерживает `extends`) 🚫 Если объект должен быть мутабельным (изменяемым) 🚫 Если в классе должна быть сложная логика поведения ✍️ Итог Используйте record, если вам нужен простой DTO (Data Transfer Object) без лишнего кода. Но если у объекта есть логика, стоит оставить класс. 👉@BookJava

🔹 Разбираем Lombok: как избавиться от шаблонного кода Ты всё ещё пишешь getters и setters вручную? Используй Lombok! 💡 Как подключить? Добавь в pom.xml: <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> <scope>provided</scope> </dependency> 💡 Как использовать? import lombok.Data; @Data public class User { private String name; private int age; } Теперь getName(), setName() и toString() сгенерируются автоматически! 👉 Lombok. Полное руководство https://auth0.com/blog/a-complete-guide-to-lombok/ Кто уже использует Lombok в своих проектах? 👉@BookJava

🚀 Stream API в Java: 5 мощных трюков, которые ты мог не знать Stream API – одна из самых крутых фич в Java, но многие используют только map(), filter() и collect(). Давай разберем 5 полезных трюков, которые сделают код элегантнее и эффективнее! 🔹 1. Группировка элементов (Collectors.groupingBy) Разбиваем список строк на группы по длине:

List<String> words = List.of("apple", "banana", "cat", "dog", "elephant");
Map<Integer, List<String>> grouped = words.stream()
        .collect(Collectors.groupingBy(String::length));

System.out.println(grouped);
// {3=[cat, dog], 5=[apple], 6=[banana], 8=[elephant]}
🔹 2. Уникальные элементы (distinct()) Фильтруем дубликаты в потоке:

List<Integer> numbers = List.of(1, 2, 2, 3, 4, 4, 5);
List<Integer> unique = numbers.stream()
        .distinct()
        .collect(Collectors.toList());

System.out.println(unique); // [1, 2, 3, 4, 5]
🔹 3. Пропуск N элементов (skip(n)) Хотим пропустить первые 3 элемента и взять только оставшиеся:

List<String> names = List.of("Alice", "Bob", "Charlie", "David", "Eve");
List<String> skipped = names.stream()
        .skip(3)
        .collect(Collectors.toList());

System.out.println(skipped); // [David, Eve]
🔹 4. Найти максимальное значение (max()) Допустим, у нас есть список чисел, найдем максимальное:

List<Integer> nums = List.of(10, 20, 30, 5, 15);
Optional<Integer> maxNum = nums.stream().max(Integer::compareTo);

maxNum.ifPresent(System.out::println); // 30
🔹 5. Проверить, содержит ли список нужное значение (anyMatch()) Допустим, нам нужно проверить, есть ли в списке число больше 100:

List<Integer> nums = List.of(10, 50, 200, 30);
boolean hasLargeNumber = nums.stream().anyMatch(n -> n > 100);

System.out.println(hasLargeNumber); // true
🔥 Stream API – это мощный инструмент для работы с коллекциями. Используйте его, и ваш код станет чище, короче и быстрее! А какие крутые трюки со стримами знаете вы? Делитесь в комментариях! 👇 👉@BookJava