Найти в Дзене
⚡️ Java совет: перестань терять производительность из-за boxing
Когда используешь Stream<Integer>, JVM создаёт объект Integer для каждого значения. Это лишние аллокации, нагрузка на GC и замедление кода. Если работаешь с примитивами — используй primitive streams. ❌ Boxing (медленнее) Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5); int sumBoxed = boxed.reduce(0, Integer::sum); ✅ Без boxing (быстрее и эффективнее) int sumPrimitive = IntStream...
1 день назад
⚠️ Маленькая настройка в Spring Boot, которая может спасти от скрытых багов
Лучше не менять значение по умолчанию: spring.main.allow-bean-definition-overriding=false Что это делает? Если в приложении два бина с одинаковым именем, Spring не запустится. И это на самом деле хорошо. Почему: ✔ помогает сразу увидеть конфликт конфигурации ✔ не даёт одному бину тихо перезаписать другой ✔ предотвращает скрытые баги в DI Если же включить: spring.main...
3 дня назад
⚡️ Перестаём писать методы с 7+ параметрами
Если сигнатура выглядит как: createUser(firstName, lastName, email, phone, address, city, country) Это уже сигнал, что модель данных развалилась. Проблема не только в читаемости. Такие методы сложнее поддерживать, расширять и тестировать. Любое изменение ломает сигнатуру и тянет за собой каскад правок....
4 дня назад
👣 На Stepik обновили курс «Rust: полный курс разработчика
👣 На Stepik обновили курс «Rust: полный курс разработчика. С нуля до профи» Представьте: через три месяца вы открываете чужой Rust-код и читаете его как книгу. Arc<Mutex<T>> не вызывает панику. impl Future не пугает. Вы точно знаете, почему компилятор ругается и как это починить за 10 секунд. Это не фантазия. Это результат 50 уроков, в которых каждая концепция объясняется через код и закрепляется практикой...
4 дня назад
☕ Java совет: рекурсивный обход файловой системы
В Java есть удобный способ рекурсивно обойти все файлы в директории - метод Files.walk(). Он возвращает Stream<Path>, что позволяет легко фильтровать и обрабатывать файлы через Stream API. Пример - найти все .java файлы в папке src: import java.io.IOException; import java.nio.file.*; import java.util.stream.Stream; public class Main { public static void main(String[] args) { Path startPath = Paths.get("src"); try (Stream<Path> paths = Files.walk(startPath)) { paths .filter(Files::isRegularFile) ...
5 дней назад
⚠️ Spring Boot: не включайте publish-request-params в production
В Spring Boot есть настройка: spring.mvc.publish-request-params=true Она включает логирование параметров HTTP-запросов. Это удобно в dev-среде, потому что можно видеть: • request headers • query parameters • form data Обычно это используют вместе с фильтром: @Bean public CommonsRequestLoggingFilter logFilter() { CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter(); filter.setIncludeQueryString(true); filter.setIncludeHeaders(true); filter.setIncludePayload(true); filter.setMaxPayloadLength(1000); filter.setAfterMessagePrefix("COMPLETE REQUEST: "); return filter; } Но есть важная проблема...
1 неделю назад
☕ Java совет: List.reversed
() В Java появился удобный метод List.reversed(), который возвращает обратное представление списка (view). Важно понимать: он не изменяет оригинальный список и не создаёт новую копию - это просто reversed-view поверх исходного списка. Пример: var list = List.of("A", "B", "C"); var reversed = list.reversed(); System.out.println(reversed); // [C, B, A] System.out.println(list);...
1 неделю назад
🚀 Ты всё ещё называешь обёртку над ChatGPT «AI-продуктом
»? Пока ты пишешь промпты - рынок уже ушёл дальше. Сейчас выигрывают не те, кто умеет красиво формулировать запросы, а те, кто строит агентные системы: - принимают решения сами - ходят в API - работают с Postgres и Redis - управляют браузером через Playwright - доводят задачи до результата без человека И вот правда, о которой мало говорят: 90% таких систем умирают между ноутбуком и продом. Работает локально. Ломается в реальности. Нет архитектуры. Нет устойчивости. Нет деплоя. AI Agents Engineering - курс со Stepik, который закрывает этот разрыв...
1 неделю назад
💡 Полезный Java-трюк: ThreadLocal.withInitial
() Если нужно, чтобы каждый поток имел собственное значение переменной, используйте ThreadLocal. Метод withInitial() позволяет задать значение по умолчанию, которое будет создаваться лениво — только при первом обращении потока. Пример: ThreadLocal<Integer> counter = ThreadLocal.withInitial(() -> 0); counter.get(); // 0 counter.set(70); counter.get(); // 70 Что происходит: • каждый поток...
1 неделю назад
🚀 Java: используйте ReentrantReadWriteLock, когда чтений намного больше, чем записей
Если у вас есть общий ресурс (например, кэш, конфигурация или состояние сервиса), который часто читают разные потоки, но редко изменяют — обычный synchronized может сильно тормозить систему. В таких случаях лучше использовать ReentrantReadWriteLock из java.util.concurrent. Идея простая: - Read Lock — позволяет нескольким потокам читать данные одновременно - Write Lock — разрешает запись только одному потоку и блокирует всех остальных Таким образом можно сильно увеличить параллелизм: десятки потоков могут читать данные одновременно, а запись происходит эксклюзивно...
1 неделю назад
🚀 Spring Boot tip: как быстро защитить REST endpoint
С Spring Boot + Spring Security можно буквально за пару строк закрыть нужные маршруты. Допустим, у нас есть контроллер: @RestController public class MyController { @GetMapping("/admin") public String admin() { return "Admin panel"; } } Теперь хотим, чтобы /admin был доступен только аутентифицированным пользователям. Добавляем конфигурацию безопасности: @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http ...
2 недели назад