gram news
Аватар канала Java Ready | Программирование

Java Ready | Программирование

@java_ready

Авторский канал по разработке на Java. Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_c Реклама на бирже: https://telega.in/c/java_ready

9,010подписчиков

Открыть канал

Последние посты

  • Java Ready | Программирование

    22 сент., 06:30

    Java 25 становится проще!Автор разбирает JEP-512 и изменения, которые позволяют писать небольшие программы с меньшим количеством обязательной обвязки. Вместо класса, static main и ручных импортов можно сосредоточиться на самой задаче, а не на стартовом шаблоне.В статье разбирают: • как устроены упрощённые исходники Java 25 • зачем появились неявные импорты и класс IO • как запускать короткие Java-скрипты из командной строкиПродолжай читать на Habr👉 Java Ready | #статья
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
  • Java Ready | Программирование

    18 сент., 17:12

    Знали, почему Pattern.compile лучше не вызывать в горячем цикле?В Java регулярные выражения часто используют для валидации, поиска и очистки строк. Рабочий код выглядит так: for (String email : emails) { if (Pattern.compile(".+@.+\\..+").matcher(email).matches()) { valid.add(email); } }Проблема в том, что Pattern.compile создаёт объект шаблона. Если делать это на каждой итерации, программа снова и снова разбирает одно и то же выражение.Для короткого списка разницы почти не видно. Но в обработке логов, CSV, API-ответов или очередей это превращается в лишнюю нагрузку.Лучше скомпилировать шаблон один раз: private static final Pattern EMAIL = Pattern.compile(".+@.+\\..+");А внутри цикла только создавать matcher: for (String email : emails) { if (EMAIL.matcher(email).matches()) {
    1,0107441Открыть в Telegram
  • Java Ready | Программирование

    18 сент., 07:12

    Проверяем пересечение временных интервалов на Java!Нужно понять, конфликтует ли новый слот с уже существующими. Такая задача встречается в календарях, бронированиях, расписаниях задач и системах записи.В этой задаче: • описываем интервал отдельным record • пишем короткое правило пересечения • фильтруем занятые слоты через stream • получаем список конфликтовВместо набора частных случаев появляется одно универсальное условие.👉 Java Ready | #задача
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
  • Java Ready | Программирование

    17 сент., 08:12

    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
  • Java Ready | Программирование

    16 сент., 12:12

    Почему BigDecimal.equals может странно работать даже при одинаковом числе?BigDecimal часто используют для денег, процентов и точных расчётов. Но сравнивать такие значения через equals не всегда то, что ожидается.Посмотри на пример: var a = new BigDecimal("1.0"); var b = new BigDecimal("1.00");System.out.println(a.equals(b));Математически это одно и то же значение. Но equals вернёт false, потому что BigDecimal сравнивает не только число, но и scale.У этих объектов разный scale: System.out.println(a.scale()); // 1 System.out.println(b.scale()); // 2Для денежных расчётов это может быть неожиданно. Например, значение из базы пришло как 1.00, а значение из расчёта получилось как 1.0.Если нужно сравнить именно числовое значение, используй compareTo: if (a.compareTo(b) == 0) {
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
  • Java Ready | Программирование

    16 сент., 08:12

    Шпаргалка по контейнеризации Java-приложений!Например, multi-stage build помогает не тащить инструменты сборки в production-образ, а .dockerignore убирает лишние файлы из build context.На картинке собраны практики для Docker-образов с Java. Есть фиксированные base image теги, минимальный runtime, запуск не от root, обработка сигналов, graceful shutdown, .dockerignore и проверка уязвимостей.Сохрани, чтобы не потерять!👉 Java Ready | #совет
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
  • Java Ready | Программирование

    15 сент., 15:12

    Собираем поиск по словам на Java!Нужно быстро находить документы, где встречается слово. Сделаем небольшой inverted index, который хранит для каждого слова набор id документов.Начнём с хранилища индекса: Map<String, Set<Integer>> index = new HashMap<>();Документ можно представить обычной строкой: int id = 7; String text = "Java streams and maps";Разобьём текст на слова в нижнем регистре: String[] words = text .toLowerCase() .split("\\W+");Теперь добавим каждое слово в индекс: for (String word : words) { index.computeIfAbsent(word, k -> new HashSet<>()) .add(id);
    8575221Открыть в Telegram
  • Java Ready | Программирование

    15 сент., 08:12

    Шпаргалка по контейнеризации Java-приложений!Например, multi-stage build помогает не тащить инструменты сборки в production-образ, а .dockerignore убирает лишние файлы из build context.На картинке собраны практики для Docker-образов с Java. Есть фиксированные base image теги, минимальный runtime, запуск не от root, обработка сигналов, graceful shutdown, .dockerignore и проверка уязвимостей.Сохрани, чтобы не потерять!👉 Java Ready | #ресурс
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    8744431Открыть в Telegram
  • Java Ready | Программирование

    14 сент., 08:12

    Хорошая статья про обработку ошибок в Kafka!Автор разбирает ситуацию, когда консьюмер не может обработать сообщение и снова упирается в тот же offset. Дальше показывает, как использовать Dead Letter Queue, retryable и non-retryable ошибки.В статье автор показывает: • почему ошибка десериализации может остановить консьюмера • как настроить DeadLetterPublishingRecoverer в Spring Kafka • зачем выносить проблемные сообщения в отдельный DLT процессорПродолжай читать на Habr👉 Java Ready | #статья
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    1,1505322Открыть в Telegram
  • Java Ready | Программирование

    12 сент., 12:10

    Почему Stream.peek не стоит использовать для бизнес-логики?peek выглядит удобным способом вставить действие внутрь stream pipeline. Часто туда кладут логирование, метрики или даже изменение объекта.Например, такой код кажется коротким: users.stream() .peek(User::activate) .toList();Проблема в том, что peek задуман как инструмент для отладки и наблюдения за элементами, а не как основной шаг бизнес-логики.Пока нет terminal operation, ничего не выполняется: users.stream() .peek(User::activate);В этом примере activate вообще не вызовется, потому что pipeline только описан, но не запущен.Ещё хуже, когда поведение зависит от terminal operation. Например, count может быть оптимизирован так, что часть промежуточных действий не выполняется ожидаемым способом.Если нужно изменить объекты явно, лучше использовать обычный цикл:
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    1,1607421Открыть в Telegram
  • Java Ready | Программирование

    12 сент., 07:12

    📂 Напоминалка по структуре каталогов Linux!Например, /bin содержит системные бинарные файлы, а /etc — конфигурации, управляющие поведением системы.На картинке — директории Linux, их назначение и место в иерархии.Сохрани, чтобы не забыть!👉 Java Ready | #ресурс
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    1,0309542Открыть в Telegram
  • Java Ready | Программирование

    11 сент., 06:12

    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    1,070985Открыть в Telegram
  • Java Ready | Программирование

    10 сент., 08:12

    Собираем diff двух списков по id!Нужно сравнить старый и новый список объектов и понять, что добавилось, что изменилось и что исчезло. Сделаем небольшой diff по идентификатору.В этой задаче: • индексируем старые элементы по id • ищем новые и изменённые записи • отдельно находим удалённые id • возвращаем понятный результатТакой подход полезен для синхронизации справочников, импорта данных, обновления кеша и подготовки изменений перед записью в базу.👉 Java Ready | #задача
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    1,1505441Открыть в Telegram
  • Java Ready | Программирование

    9 сент., 15:12

    Делаем простой registry обработчиков команд на Java!Когда команд становится больше, длинная цепочка if/else быстро начинает мешать. Вместо этого можно хранить обработчики в Map.Опишем интерфейс команды: @FunctionalInterface interface Command { void run(String[] args); }Создадим registry: Map<String, Command> commands = new HashMap<>();Добавим пару команд: commands.put("hello", args -> System.out.println("Hello, " + args[0]));commands.put("sum", args -> System.out.println(Integer.parseInt(args[0]) + Integer.parseInt(args[1])));
    1,1408621Открыть в Telegram
  • Java Ready | Программирование

    9 сент., 07:12

    Java Programming MOOC - большой курс Java от University of Helsinki!На сайте собран большой открытый курс по Java от University of Helsinki. Есть две части, отдельные уроки, упражнения, основы синтаксиса, объекты, коллекции, обработка ошибок, файлы и более продвинутые темы.Материал удобно проходить по главам. В боковой навигации есть части курса, внутри разделов много объяснений и примеров, поэтому ресурс хорошо подходит как маршрут от базы к уверенной практике.Оставляю ссылочку на Java Programming MOOC👉 Java Ready | #ресурс
    1,140видео11541Открыть в Telegram
  • Java Ready | Программирование

    8 сент., 15:12

    Разбиваем список на батчи в Java!Когда нужно отправить много записей в API или базу, их часто удобнее обрабатывать пачками. Так проще контролировать нагрузку и размер одного запроса.Пусть есть список событий: List events = List.of("a", "b", "c", "d", "e");Размер пачки лучше держать отдельной переменной: int batchSize = 2;Идём по списку шагом batchSize: for (int start = 0; start < events.size(); start += batchSize) { int end = Math.min(start + batchSize, events.size()); }Теперь получаем часть списка: List batch = events.subList(start, end);Эту пачку можно отправить дальше: sendBatch(batch);
    1,200732Открыть в Telegram
  • Java Ready | Программирование

    8 сент., 08:12

    Шпаргалка по generics в Java!Например, ? extends T удобно использовать для чтения данных из producer-коллекции, а ? super T подходит для коллекции, в которую нужно безопасно добавлять значения.На картинке собраны generics, wildcards, PECS, method overloading, recursive generics, covariance и важный нюанс type erasure. Особенно полезно держать под рукой правило Producer Extends Consumer Super.Сохрани, чтобы не потерять!👉 Java Ready | #ресурс
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    1,2108332Открыть в Telegram
  • Java Ready | Программирование

    7 сент., 09:12

    Интересный разбор WebFlux и Virtual Threads под нагрузкой!Автор сравнивает реактивный WebFlux и Spring MVC с виртуальными потоками на микросервисной системе под нагрузкой 2000 RPS.В статье автор показывает: • чем event loop отличается от thread-per-request модели • как WebFlux и Virtual Threads ведут себя при I/O • какие параметры JVM и Spring влияют на результатПродолжай читать на Habr👉 Java Ready | #статья
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    1,270622Открыть в Telegram
  • Java Ready | Программирование

    4 сент., 08:12

    Собираем маскировщик секретов для логов!В логах не должны оставаться токены, пароли и API-ключи. Сделаем небольшой sanitizer, который находит опасные поля и заменяет значение на маску.В этой задаче: • описываем шаблон секретного поля • используем Matcher для замены • сохраняем имя ключа • прячем только значение после знака равенства👉 Java Ready | #задача
    Иллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | ПрограммированиеИллюстрация к посту канала Java Ready | Программирование
    1,63084321Открыть в Telegram
  • Java Ready | Программирование

    3 сент., 07:12

    W3Resource Java Exercises - большая база задач по Java!На сайте собраны тысячи упражнений по Java с решениями и пояснениями. Есть базовый синтаксис, методы, массивы, строки, коллекции, исключения, потоки, ООП, регулярные выражения и алгоритмы.Разделы удобно проходить как практику. Можно открыть конкретную тему, решить задачу самостоятельно, сравнить с готовым решением и перейти к похожим упражнениям.Оставляю ссылочку на W3Resource👉 Java Ready | #ресурс
    1,330видео1485Открыть в Telegram