Подсказка по Java: начиная с Java 9 можно использовать
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
Вместо:
Вы можете сделать следующее:
👉 Java Portal
Stream.takeWhile() для удобного «нарезания» списков через стримы. Это простой способ взять элементы, пока выполняется нужное условие, без лишнего кода.List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
Вместо:
List<Integer> result = new ArrayList<>();
for (Integer n : numbers) {
if (n < 5) {
result.add(n);
} else {
break;
}
}
System.out.println(result); // [1, 2, 3, 4]
Вы можете сделать следующее:
result = numbers.stream()
.takeWhile(n -> n < 5)
.toList();
System.out.println(result); // [1, 2, 3, 4]
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤8
Парень собрал репозиторий, чтобы показать новые встроенные возможности отказоустойчивости в Spring Framework 7. Никаких дополнительных зависимостей вроде spring-retry — все уже под капотом 🤯
Можно использовать декларативную аннотацию
Можно написать свой
Нужен больше контроля — бери
Хочешь ограничить число одновременных подключений — используй
👉 Java Portal
Можно использовать декларативную аннотацию
Retry, чтобы настроить, как и когда нужно повторять выполнение Можно написать свой
listener, чтобы получить наблюдаемость за разными событиями.Нужен больше контроля — бери
RetryTemplate Хочешь ограничить число одновременных подключений — используй
ConcurrentPlease open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥6
Мы охотились за лишними 300 мс задержки в микросервисе. Думали, что это сборщик мусора в Java.
Два дня крутили настройки JVM. Ноль эффекта.
А настоящая проблема оказалась в git clone внутри init-контейнера.
Сервис случайно настроили так, что он на каждом старте клонировал репозиторий ради одного конфиг-файла.
Клонирование было медленным, но задержка терялась на фоне общего старта приложения.
Сервис не тормозил - он просто постоянно перезапускался.
Всегда проверяйте сайдкары и init-контейнеры раньше, чем лезете в логику приложения.
👉 Java Portal
Два дня крутили настройки JVM. Ноль эффекта.
А настоящая проблема оказалась в git clone внутри init-контейнера.
Сервис случайно настроили так, что он на каждом старте клонировал репозиторий ради одного конфиг-файла.
Клонирование было медленным, но задержка терялась на фоне общего старта приложения.
Сервис не тормозил - он просто постоянно перезапускался.
Всегда проверяйте сайдкары и init-контейнеры раньше, чем лезете в логику приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥3🏆3❤1
IntelliJ IDEA начнет использовать JSpecify как основную null-safe библиотеку начиная с версии 2025.3.
"Переход на JSpecify это хороший пример того, как совместная работа в экосистеме Java приводит не просто к очередному стандарту, а к тому, который реально приносит пользу разработчикам."
👉 Java Portal
"Переход на JSpecify это хороший пример того, как совместная работа в экосистеме Java приводит не просто к очередному стандарту, а к тому, который реально приносит пользу разработчикам."
Please open Telegram to view this post
VIEW IN TELEGRAM
Null-safe applications with Spring Boot 4
Level up your Java code and explore what Spring can do for you.
❤5👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Ребята сделали крутейший курс по Linux, где понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами обучают работе с этой ОС
Внутри 20+ модулей: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой).
После прохождения вы получите сертификат, который можно добавить в резюме.
Есть бесплатные демо-уроки для ознакомления. В ближайшие 48ч курс доступен со скидкой 25% по промокоду «
LINUXTG25»: открыть курс на StepikPlease open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥1
Многие ненавидят Java не потому что язык плохой, а потому что первое знакомство с ним вышло травматичным.
В универе его чаще всего преподавали на примерах из прошлого века, а преподаватели были больше заняты тем, чтобы сто раз написать public static void main, чем объяснить, почему всё устроено именно так. А ещё эта многословность, ошибки компиляции, необходимость сходу понимать классы, объекты, наследование… неудивительно, что после такой встречи у людей остаётся отвращение.
Плюс порог входа у Java выше, чем у более дружелюбных языков вроде Python или JavaScript. И хотя это уже давно не тот тормозной тяжёлый язык из 2000-х, многие до сих пор думают о нем именно так, не замечая, что сегодня он работает почти во всех крупных системах.
И тут самое забавное: пока в интернете его поливают грязью, компании всё так же активно ищут Java-разработчиков и платят им очень хорошие деньги. Потому что в реальном мире остаётся то, что работает и масштабируется.
👉 Java Portal
В универе его чаще всего преподавали на примерах из прошлого века, а преподаватели были больше заняты тем, чтобы сто раз написать public static void main, чем объяснить, почему всё устроено именно так. А ещё эта многословность, ошибки компиляции, необходимость сходу понимать классы, объекты, наследование… неудивительно, что после такой встречи у людей остаётся отвращение.
Плюс порог входа у Java выше, чем у более дружелюбных языков вроде Python или JavaScript. И хотя это уже давно не тот тормозной тяжёлый язык из 2000-х, многие до сих пор думают о нем именно так, не замечая, что сегодня он работает почти во всех крупных системах.
И тут самое забавное: пока в интернете его поливают грязью, компании всё так же активно ищут Java-разработчиков и платят им очень хорошие деньги. Потому что в реальном мире остаётся то, что работает и масштабируется.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26
Совет по Java: можно использовать
Обычный способ:
Через joining:
👉 Java Portal
Collectors.joining(", ") чтобы собрать Stream в строку с разделителем запятая (или любым другим, если нужно).Обычный способ:
List<String> items = List.of("a", "b", "c");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < items.size(); i++) {
sb.append(items.get(i));
if (i < items.size() - 1) {
sb.append(", ");
}
}
System.out.println(sb.toString());Через joining:
List<String> items = List.of("a", "b", "c");
String result = items.stream().collect(Collectors.joining(", "));
System.out.println(result.toString());Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍3
API VERSIONING позволяет разработчикам поддерживать несколько версий эндпоинтов веб-сервиса (например, /users или /products), не ломая интеграции у клиентов при внесении изменений.
В новом Spring Boot 4 появилась встроенная поддержка версионирования API, и настраивается она очень просто.
→ Добавь строки в конфиг (
1 способ: версионирование через заголовок
(Клиент передает версию в header, например: api-version: 1 — название заголовка можно выбрать любое)
2 способ: версионирование через query-параметр
(Клиент передает версию в запросе, например: ?version=1)
→ Установка версии по умолчанию
(Используется версия 1.0, если клиент ничего не указал)
Примечание: если версия указана и в заголовке, и в query-параметре, то приоритет у более высокой версии. Например, header = 2, query = 1 → в итоге будет 2.
Готово.
a) Без множества контроллеров
b) Без /v1/, /v2/ в URL
c) Код чище и проще поддерживать
👉 Java Portal
В новом Spring Boot 4 появилась встроенная поддержка версионирования API, и настраивается она очень просто.
→ Добавь строки в конфиг (
application.properties) под твой сценарий. Можно использовать оба варианта одновременно — заголовки и query-параметры.1 способ: версионирование через заголовок
(Клиент передает версию в header, например: api-version: 1 — название заголовка можно выбрать любое)
spring.mvc.apiversion.use.header = api-version
2 способ: версионирование через query-параметр
(Клиент передает версию в запросе, например: ?version=1)
spring.mvc.apiversion.use.query-parameter = version
→ Установка версии по умолчанию
(Используется версия 1.0, если клиент ничего не указал)
spring.mvc.apiversion.default = 1.0
Примечание: если версия указана и в заголовке, и в query-параметре, то приоритет у более высокой версии. Например, header = 2, query = 1 → в итоге будет 2.
Готово.
a) Без множества контроллеров
b) Без /v1/, /v2/ в URL
c) Код чище и проще поддерживать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥7❤2
Spring Boot: на этапе разработки можно включить spring.main.lazy-initialization=true, чтобы ускорить запуск приложения.
По умолчанию Spring Boot инициализирует все бины при старте. В среде разработки это приводит к:
Более долгому старту приложения, особенно в крупных проектах
Приходится ждать загрузки бинов, которые прямо сейчас даже не нужны
Чтобы избежать этого, в
Важно сохранить поведение по умолчанию в проде, потому что:
Ошибки на старте выявляются раньше
Все компоненты готовы принимать запросы сразу
👉 Java Portal
По умолчанию Spring Boot инициализирует все бины при старте. В среде разработки это приводит к:
Более долгому старту приложения, особенно в крупных проектах
Приходится ждать загрузки бинов, которые прямо сейчас даже не нужны
Чтобы избежать этого, в
application.properties укажите:spring.main.lazy-initialization=true
Важно сохранить поведение по умолчанию в проде, потому что:
Ошибки на старте выявляются раньше
Все компоненты готовы принимать запросы сразу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1