Java Ready | Программирование
9.34K subscribers
1.46K photos
77 videos
1 file
774 links
Авторский канал по разработке на Java.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Cотрудничество: @energy_c
Download Telegram
Знали, что Map.getOrDefault может вызвать загрузку, даже когда ключ уже есть?

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

Поэтому дорогой вызов справа выполнится заранее:
User user = users.getOrDefault(id, loadUser(id));


Даже если users уже содержит id, loadUser(id) успеет выполниться. Если это запрос к базе, сеть или вычисление, приложение потратит время зря.

Для ленивого вычисления значения подойдёт computeIfAbsent:
User user = users.computeIfAbsent(id, this::loadUser);


Функция загрузки вызывается только тогда, когда ключ отсутствует или связан с null. Возвращённое ненулевое значение добавляется в map и дальше берётся из неё.

Проверь и семантику отсутствующего результата. Если загрузчик вернёт null, запись не появится, и следующий вызов снова попробует загрузить пользователя:
User user = users.computeIfAbsent(id, key -> findUser(key).orElse(null));


Ещё один нюанс касается конкурентного доступа. Для параллельных потоков выбирай подходящую concurrent map и не помещай в функцию долгую блокирующую работу без понимания гарантий конкретной реализации.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3❤2
Проверяем подпись webhook через HMAC в Java!

Webhook нельзя считать доверенным только потому, что он пришёл по HTTPS. Подпись позволяет проверить, что отправитель знает общий секрет и что тело запроса не изменилось по пути.

В этой задаче:
• декодируем секретный ключ
• вычисляем HMAC-SHA256 по исходному телу
• сравниваем результат с подписью запроса


Проверяй подпись до обработки данных и используй формат, который задаёт webhook.

👉 Java Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥2
Шпаргалка по выбору типа даты и времени в Java!

Для календарного интервала вроде срока подписки используют Period, а для точной длительности в часах и секундах подходит Duration. Когда важен конкретный момент, выбирают Instant или тип с часовым поясом.

На картинке собрана схема выбора между LocalDate, LocalTime, LocalDateTime, Instant и ZonedDateTime. Она помогает не потерять часовой пояс там, где он влияет на расписание и переходы летнего времени.

Сохрани, чтобы не потерять!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥3
Ищем новичков во frontend-разработке и вёрстке сайтов.

Айтилогия запускает бесплатное обучение, где будет:

1. Практика на реальном заказе ценой до 10 000₽.
2. Разбор работ куратором.
3. Задачи от Fullstack-разработчика с 12-летним опытом.
4. Именной сертификат.

И главное — ты почувствуешь уверенность.
Потому что увидишь, что выполнить заказ на frontend-проект тебе по силам.

👉 Приходи на бесплатное обучение и зови с собой друзей

🔥 С 2019 Айтилогия стабильно помогает с обучением, практикой, зарабатывать на фрилансе и проходить собеседования.
Проверяем пересечение бронирований на Java!

В календаре нужно отклонить новую бронь, если выбранное время уже занято. Для проверки достаточно сравнить начало и конец двух интервалов, не перебирая каждую минуту внутри них.

Сделаем модель с полуоткрытым интервалом, где начало включается, а конец уже свободен:
record Booking(LocalDateTime start, LocalDateTime end) {
    Booking {
        if (!start.isBefore(end)) {
            throw new IllegalArgumentException("End must be after start");
        }
    }

boolean overlaps(Booking other) {
        return start.isBefore(other.end())
            && other.start().isBefore(end);
    }
}


Проверка не даст создать бронь нулевой или отрицательной длины. Условие пересечения учитывает обе границы и не считает соседние интервалы конфликтом.

Подготовим уже занятые промежутки и новый запрос:
List<Booking> existing = List.of(
    new Booking(start1, end1),
    new Booking(start2, end2)
);
Booking requested = new Booking(requestStart, requestEnd);


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

Проверим весь список и получим понятный результат:
boolean conflict = existing.stream()
    .anyMatch(booking -> booking.overlaps(requested));


anyMatch завершает проверку, как только найдёт первое пересечение. Если conflict равен false, новую бронь можно добавить, а интервалы, которые соприкасаются ровно по границе, останутся допустимыми.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥2
Можно ли запустить Linux из Java, не подключая JNI-библиотеку?

Автор строит небольшой гипервизор на Java 25 и обращается к Linux KVM через Foreign Function & Memory API. Программа открывает /dev/kvm, создаёт виртуальную машину и настраивает память для гостевой системы.

В статье разбирают:
• как FFM описывает нативные функции и структуры KVM
• какие шаги нужны, чтобы загрузить ядро Linux
• как подключить консоль гостевой системы к терминалу Java

В результате внутри процесса Java стартует минимальная Linux-система с BusyBox и интерактивной оболочкой.

Продолжай читать на Habr!


👉 Java Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥2
Сверстал сайт → заработал 20 000₽.
 
Просто вдумайся:
Кто-то каждый день тратит по 3–4 часа на дорогу за скромную зарплату.
Пробки, маршрутки, час-пик — один и тот же маршрут годами.
 
А кто-то за это же время…
собирает бизнесу сайт или апку со своего ноутбука, без привязки к месту и графику, и получает европейскую зарплату.
 
Без сложных задач.
Без многолетнего обучения.
Без дорогого ноутбука.
 
Задача проста:
1. Берёшь информацию клиента
2. Прогоняешь через GPT
3. Верстаешь сайт по блокам
4. Грузишь на хостинг
5. Сдаёшь работу и получаешь деньги.
 
Новички без опыта обычно выходят на 50–80 тыс ₽ в месяц,
и за год легко вырастают до 150 тыс ₽ и выше.
 
Работаешь в удобное тебе время, поэтому легко совмещать с текущей работой, учёбой, путешествием по миру…
 
👉 Пройди бесплатное обучение, и ты поймёшь, что это не просто слова.
 
Начинаем уже завтра.

Реклама. ИП Чернова О. А., ИНН:771399721044
😁6
Публикуем готовый отчёт без частично записанного файла!

Допустим, другая программа постоянно проверяет папку с отчётами. Если записывать сразу в итоговый файл, читатель может открыть его посреди записи и увидеть только половину содержимого. Подготовим данные во временном файле, а затем опубликуем готовый результат одним перемещением.

Создадим временный файл прямо в целевой папке. Это важно для атомарного перемещения, которое обычно возможно только внутри одной файловой системы:
Path dir = Path.of("reports");
Files.createDirectories(dir);
Path temp = Files.createTempFile(dir, ".report-", ".tmp");


Итоговое имя сделаем уникальным для этой публикации. Здесь предполагается, что содержимое уже находится в строке report:
Path target = dir.resolve(UUID.randomUUID() + ".txt");


Если запись не удалась, временный файл нужно убрать. Поместим запись и перенос в try, а очистку в finally:
try {
Files.writeString(temp, report, StandardCharsets.UTF_8);
Files.move(temp, target, StandardCopyOption.ATOMIC_MOVE);
} finally {
Files.deleteIfExists(temp);
}


При успешном переносе временного пути уже нет, поэтому deleteIfExists ничего не удалит. Если операция сорвалась, он уберёт незавершённый файл. Другой процесс увидит итоговое имя только после перемещения, а не во время записи.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4🔥4