🎭 Stream API: 3 неочевидных приёма, которые упростят ваш код Все знают filter() и map(), но Stream API гораздо богаче! ✈️ 1. Take/Drop While (Java 9+) — умная фильтрация: // Раньше: сложная логика с флагами List<Integer> numbers = List.of(1, 2, 3, -1, 4, 5); // Взять элементы, пока условие истинно numbers.stream() .takeWhile(n -> n > 0) // [1, 2, 3] .forEach(System.out::println); // Пропустить элементы, пока условие истинно numbers.stream() .dropWhile(n -> n > 0) // [-1, 4, 5] .forEach(System.o...
Java-разработчик
Канал о разработке на языке Java, различных особенностях этого языка программирования, истории языка. Примеры рабочего кода на Java и советы разработчикам. Есть также связанный с каналом чат: t.me/iamjavadevchat, @iamjavadevchat
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20🎯 Аннотации: что они МОГУТ и чего НЕ МОГУТ делать. Аннотации — мощный инструмент метапрограммирования, но многие ждут от них чудес. 🆗 Что аннотации МОГУТ: 1. Предоставлять метаданные для фреймворков (@RestController,@Entity) 2. Генерировать код через процессоры аннотаций (Lombok, MapStruct) 3. Влиять на поведение через AOP (@Transactional, @Cacheable) 4. Валидировать данные (@NotNull, @Size) 👎 Что аннотации НЕ МОГУТ: 1. Изменять поведение существующего кода напрямую — только через обработчики...
🔄 OSR: Как JVM перекомпилирует код прямо во время выполнения JIT-компиляция — это не только «прогрев». JVM умеет переключаться с интерпретатора на скомпилированный код посреди выполнения метода! 🖥 Сценарий: У вас есть долгий цикл, который выполняется тысячи итераций. JVM не будет ждать следующего вызова метода — она перекомпилирует его прямо во время выполнения текущего вызова. ⚙️Как это работает: Интерпретатор исполняет метод ↓ Счётчик итераций цикла достигает порога (например, 10K) ↓ JVM ост...
☄️ JIT-компиляция: почему первые 10 000 вызовов метода — самые медленные Знаете ли вы, что Java компилирует ваш код дважды? Сначала в байт-код, а потом — в нативный код прямо во время выполнения! 🔼 Уровни компиляции C1/C2: 1. Интерпретатор — первые 1-2K вызовов, медленно 2. C1 (клиентский компилятор) — быстрая компиляция, средняя оптимизация 3. C2 (серверный компилятор) — медленная компиляция, агрессивные оптимизации ❓ Что делает C2 таким умным: ✈️ Inlining — подставляет тело мелких методов ✈️ ...
⏳ TimeZone: тихая проблема, которая ударит в продакшене. LocalDateTime vs ZonedDateTime vs Instant — выбор не просто так. 🚫🙅 Типичная ошибка: // ОПАСНО для событий, которые должны быть в конкретный момент времени LocalDateTime meetingTime = LocalDateTime.of(2024, 6, 15, 14, 30); // Сохранили в БД... // У пользователя в Калифорнии meetingTime отобразится как 14:30 его времени! ✔️👍 Правильный подход: // Для моментов времени (meeting, flight, payment) — Instant Instant now = Instant.now(); // Вн...
☄️ Suppressed исключения: что происходит, когда летит сразу несколько ошибок? Знаете ли вы, что в Java исключение может нести в себе другие исключения? Это не баг, а фича — suppressed exceptions. 🖥Контекст: Возникает в блоке try-with-resources и когда в finally бросается исключение. 🤓Пример: try (var resource = new AutoCloseableResource()) { throw new RuntimeException("Основная ошибка в try-блоке"); } catch (Exception e) { System.out.println(e.getMessage()); // "Основная ошибка в try-блоке" //...
👻 Memory Leak в PermGen/Metaspace. Когда классы не хотят умирать. Часть 1. Казалось бы, сборщик мусора удаляет неиспользуемые объекты. Но что, если сам класс нельзя выгрузить? Сценарий: Динамическая загрузка классов (плагины, hot deploy, Spring DevTools) + использование не того ClassLoader'а. 📣 Суть проблемы: ClassLoader — это объект, который загружает классы. У каждого класса в метаданных JVM есть скрытая ссылка classLoader на его загрузчик. Ключевое: Чтобы выгрузить класс (и его ClassLoader)...
🎯 Виртуальные потоки (Virtual Threads): революция или эволюция? Java 21 принесла виртуальные потоки — одну из самых важных фич за последние годы. Давайте разберёмся без хайпа. Проблема: Обычные (platform) потоки Java — это обёртки над потоками ОС. Они дорогие (память ~1 МБ, затраты на переключение контекста). 10 000 потоков = 10 ГБ RAM! Решение: Виртуальные потоки — легковесные потоки JVM, которые многопоточно выполняются на небольшом пуле platform-потоков. Простой пример: try (var executor = E...
👻 Memory Leak в PermGen/Metaspace. Когда классы не хотят умирать. Часть 2. ❓ Почему это специфично для кастомных ClassLoader'ов? Системный ClassLoader (например, AppClassLoader) живёт всегда, поэтому его классы никогда не выгружаются. Проблема возникает только когда: 1. Вы создаёте временные ClassLoader'ы (для плагинов, hot deploy) 2. Хотите их выгрузить (например, при обновлении плагина) 3. Но они не выгружаются из-за таких циклических ссылок ✔️ Как исправить? 1. Избегайте статических полей в ...
🗂 Files API: перестаньте использовать java.io.File! С Java 7 (2011 год!) у нас есть современный java.nio.file.Path. Но до сих пор многие используют устаревший File. Почему Path лучше: 1. Работает с любыми файловыми системами (ZIP, FTP, память) 2. Более безопасные пути (защита от Path Traversal) 3. Удобные утилитные методы в Files 🚫 Плохо: File file = new File("data.txt"); if (file.exists()) { // ГОНКА! Файл может быть удалён между exists() и чтением BufferedReader br = new BufferedReader(new F...