java_library | Unsorted

Telegram-канал java_library - Java Books

14242

Java Библиотека По всем вопросам- @notxxx1 @ai_machinelearning_big_data - machine learning @pythonl - Python @itchannels_telegram - 🔥 best it channels @ArtificialIntelligencedl - AI @pythonlbooks-📚 @programming_books_it -it 📚 № 5032728887

Subscribe to a channel

Java Books

🔥 Полезная подборка каналов только код, практика и самые передовые инструменты, которые используют разработчики прямо сейчас.👇

🖥 ИИ: t.me/ai_machinelearning_big_data

🖥 Python: t.me/pythonl

🖥 Linux: t.me/linuxacademiya

🖥 C++ t.me/cpluspluc

🖥 Docker: t.me/DevopsDocker

🖥 Хакинг: t.me/linuxkalii

🖥 Devops: t.me/DevOPSitsec

👣 Golang: t.me/Golang_google

🖥 Аналитика: t.me/data_analysis_ml

🖥 Javascript: t.me/javascriptv

🖥 C#: t.me/csharp_ci

🖥 Java: t.me/javatg

🖥 Базы данных: t.me/sqlhub

👣 Rust: t.me/rust_code

🤖 Технологии: t.me/vistehno

💰 Экономика и инвестиции в ИИ t.me/financeStable

💼 Актуальные вакансии: t.me/addlist/_zyy_jQ_QUsyM2Vi


🖥Подборка по Golang: /channel/addlist/MUtJEeJSxeY2YTFi
⚡️ Лучшие ИИ ресурсы: /channel/addlist/2Ls-snqEeytkMDgy

Max ИИ: https://max.ru/ai_machinelearning_big_data
Max Ml: https://max.ru/vistehno
Max python: https://max.ru/pythonl
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Max Java: https://max.ru/javatg
Max Sql: https://max.ru/sqlhub
Max Devops: https://max.ru/DevOPSitsec
Анализ данных: https://max.ru/data_analysis_ml
C++ : https://max.ru/cpluspluc
C#: https://max.ru/csharp_ci

🖥 Chatgpt бот в тг: t.me/Chatgpturbobot
📚 Бесплатные ит-книги: /channel/addlist/HwywK4fErd8wYzQy

Читать полностью…

Java Books

☕ Java совет: сравнение времени без ловушек точности

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

Например:


Instant a = Instant.parse("2025-10-01T10:42:11Z");
Instant b = Instant.parse("2025-10-01T10:42:44Z");

Если сравнивать напрямую, они разные.
Но если вам важна точность до минуты, это можно легко исправить.

Используйте Instant.truncatedTo():


boolean sameMinute =
a.truncatedTo(ChronoUnit.MINUTES)
.equals(b.truncatedTo(ChronoUnit.MINUTES));

System.out.println(sameMinute); // true

Метод truncatedTo() обрезает время до нужной точности:

• ChronoUnit.MINUTES
• ChronoUnit.HOURS
• ChronoUnit.DAYS

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

Полезно для:

• логов
• временных окон
• аналитики
• дедупликации событий

Маленький приём —
но часто спасает от неочевидных багов в time-логике.

#Java #JavaDev #Backend #Programming

⚡️ Полезные ресурсы по Java 🚀 Max

@java_library

Читать полностью…

Java Books

⚠️ 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;
}


Но есть важная проблема.

В production такие логи могут случайно сохранить чувствительные данные пользователей.

Например:


POST /login
{
"username": "john",
"password": "mypassword"
}


Если включено логирование payload, такие данные могут попасть в:

• application logs
• log-агрегаторы
• мониторинг системы

А это уже серьёзная уязвимость безопасности.

Поэтому правило простое:
- включайте publish-request-params только в dev
- никогда не логируйте request body в production
- маскируйте чувствительные поля (`password`, token, `authorization`)

Маленькая настройка -
но может привести к утечке данных.

#SpringBoot #Java #Backend #Security

⚡️ Полезные ресурсы по Java 🚀 Max

@javatg

Читать полностью…

Java Books

🖥 Маленький, но мощный трюк для продакшена в Spring Boot.

Если вы используете Hibernate, добавьте:

spring.jpa.hibernate.ddl-auto=validate

Что это даёт:

- Приложение проверяет, совпадает ли схема БД с entity
- Если есть расхождения — сервис не запустится
- Никаких случайных изменений структуры в продакшене

Идеальный сценарий - использовать вместе с Flyway или Liquibase:

spring.jpa.hibernate.ddl-auto=validate
spring.flyway.enabled=true

Что в итоге:

- Все изменения БД — только через migration-скрипты
- Fail fast, если схема и код не совпадают
- Меньше сюрпризов после деплоя

Это один из тех параметров, которые могут спасти продакшен от тихих и очень дорогих ошибок.

#SpringBoot #JavaDev

Читать полностью…

Java Books

⚡ Spring Boot: как отключить лишнюю авто-конфигурацию

Иногда Spring Boot запускает больше, чем вам нужно.

Если у вас:
- кастомная конфигурация
- конфликт с дефолтными настройками
- ошибки при старте DataSource или JPA
— проблема может быть в auto-configuration.

Решение — отключить ненужные модули через @SpringBootApplication.

Пример:


@SpringBootApplication(
exclude = {
DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class
}
)
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}


Когда это полезно:

• вы используете свою конфигурацию базы
• приложение не работает с БД, но зависимости есть
• тестовые или lightweight-сервисы
• миграция старого проекта

Spring Boot умный.
Но иногда ему нужно сказать: “не делай это за меня”.

#SpringBoot #Java #Backend

Читать полностью…

Java Books

🖥 Большинство “парсеров” умирают через 2 дня.
Ты научишься делать те, которые живут в проде.

Это не про BeautifulSoup ради галочки.
Это про системы сбора данных, которые:

• не падают от мелких правок на сайте
• собирают данные в разы быстрее
• обновляют всё сами по расписанию
• обходят ограничения и баны
• выглядят как сервис, а не хаос из файлов

Ты начнёшь видеть сайты не как страницы, а как источники данных, к которым можно подключиться.

В итоге ты сможешь:

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

Это навык, который напрямую превращается в деньги.
Не “знаю Python”, а умею добывать данные из интернета профессионально.

🎁 48 часов скидка 50% на Stepik: https://stepik.org/a/269942/

Читать полностью…

Java Books

⚡️ Java совет: Отправка email в Spring Boot за 5 минут

Если в вашем Spring Boot-приложении нужно отправлять email — не пишите SMTP-логику вручную. Используйте spring-boot-starter-mail.

Он уже включает все зависимости и автоконфигурацию, поэтому вам нужно только указать настройки и вызвать отправку. Это самый быстрый способ добавить:
- подтверждение регистрации
- уведомления пользователям
- отчёты и алерты
- сервисные письма

Главный плюс минимум кода и никакой ручной настройки JavaMail. Spring Boot сам создаёт JavaMailSender и управляет соединением.


<!-- Dependency -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
⚡️<!-- application.properties -->
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=your_email@gmail.com
spring.mail.password=your_app_password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

// Service
@Autowired
private JavaMailSender mailSender;

public void sendEmail(String to, String subject, String text) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(text);
message.setFrom("your_email@gmail.com");

mailSender.send(message);
}

Читать полностью…

Java Books

🖥 Java 25: апгрейд, который экономит до 30% RAM (без правок кода)

В JDK 25 завезли одну из самых “жирных” оптимизаций за долгое время - Compact Object Headers (JEP 519).

Что меняется:
- размер заголовка объекта уменьшается примерно с ~12 байт до 8 байт
- меньше памяти на каждый объект = меньше heap
- меньше heap = меньше давления на GC
- меньше GC = быстрее сервис + дешевле облако

Где профит максимальный:
Spring Boot, микросервисы, DTO, records, кэши - всё где очень много мелких объектов.

Включается одной опцией:
-XX:+UseCompactObjectHeaders

По отзывам в реальных системах:
15–30% снижения heap - обычная история.

Просто протестируй на своих сервисах - и забирай бесплатную экономию.

Читать полностью…

Java Books

🔴 Завтра тестовое собеседование с Java-разработчиком

21 января(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир →
@shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…

Java Books

Java-совет, который убивает “хитрые” баги в проде ⚠️

Самая коварная ошибка в Java - сравнение строк через `==`.

Почему это опасно:
- == сравнивает ссылки (объекты), а не текст
- иногда “работает” из-за String Pool, а иногда ломается в проде
- из-за этого появляются баги уровня: “на деве ок, в проде не ок”

Правило:
- ✅ для сравнения текста всегда equals()
- ✅ если строка может быть null - используй "CONST".equals(str)
- ✅ если нужно без учета регистра - equalsIgnoreCase()

Подписывайся, больше фишек каждый день !


❌ ПЛОХО: упадёт, если s == null
if (s.equals("OK")) {
handle();
}

// ✅ ЛУЧШЕ: safe equals (null-safe)
if ("OK".equals(s)) {
handle();
}

// ✅ Универсально: сравнение объектов + null-safe
if (Objects.equals(s, "OK")) {
handle();
}

Читать полностью…

Java Books

💡Java Совет : Helper-классы - да. “God class” - нет.

Хорошая практика в Java - выносить повторяющуюся логику в helper / utility классы.
Это делает код чище и уменьшает дублирование.

Но есть опасная крайность - God class:
класс, который “умеет всё” и постепенно превращается в помойку.

✅ Правильно (helper класс)
Например TextUtils, который делает только одну вещь:
- форматирование текста
- обработка строк
- простые операции над конкретной областью

❌ Плохо (God class)
Типичный DoThings, где впихнули всё подряд:
- работа с файлами
- логирование
- бизнес-операции
- управление задачами
- и ещё 20 методов “на всякий случай”

Почему это плохо:
- сложно тестировать
- сложно поддерживать
- сложно менять (ломается всё)
- растёт связанность и хаос

Правило:
Helper-класс должен иметь одну ответственность.
Если класс делает слишком много несвязанных вещей - разбивай на отдельные компоненты.

Читать полностью…

Java Books

🔥 Хочешь прокачаться в аналитике, но не просто читать теорию, а решать реальные задачи?

Мы запустили полностью бесплатный телеграм-тренажёр 👇

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

Что внутри:

✔ живые кейсы из реальной практики
✔ удобный симулятор - как работа в компании, только бесплатно
✔ разбор ошибок — понимаешь не только «как», но и «почему»
✔ добавляем задачи с интервью и улучшаем бот вместе с сообществом

Начни тренироваться сегодня — и почувствуй уверенность в работе с данными.

t.me/Analitics_databot

Читать полностью…

Java Books

🖥 Java-совет, который часто экономит ресурсы

orElseGet() вместо orElse(), когда значение считать дорого

Многие пишут так:


User user = cache.find(id).orElse(createDefaultUser());


Проблема: createDefaultUser() выполнится всегда,
даже если пользователь нашёлся в кэше.

Правильнее так:

User user = cache.find(id).orElseGet(() -> createDefaultUser());


💡 В чём фишка

orElse() сначала вызывает аргумент, потом проверяет Optional

orElseGet() вызывает лямбду только если значение пустое

📌 Когда это особенно важно

- создание объектов «по умолчанию» дорогое
- требуется загрузка из БД/сети
- есть тяжёлая сериализация или вычисления

Читать полностью…

Java Books

Spring Boot Tip: тестируем REST проще с `RestTestClient` 🚀

В Spring Boot можно легко писать интеграционные тесты для REST-эндпоинтов,
используя `RestTestClient` вместе с аннотацией:


@AutoConfigureRestTestClient


Это автоматически настраивает клиент и позволяет:
- отправлять запросы прямо из тестов
- проверять статус и тело ответа
- работать с объектами, а не “сырым” JSON

Пример

Копировать код
@SpringBootTest
@AutoConfigureRestTestClient
public class PersonControllerTests {

private static final String API_PATH = "/persons";

@Test
void add(@Autowired RestTestClient restTestClient) {
restTestClient.post().uri(API_PATH)
.body(Instancio.create(Person.class))
.exchange()
.expectStatus().is2xxSuccessful()
.expectBody(Person.class)
.value(person -> assertNotNull(person.getId()));
}
}

👉 Для TestRestTemplate есть похожая аннотация:

@AutoConfigureTestRestTemplate

Тесты становятся чище, короче и ближе к реальному поведению API ✨

Читать полностью…

Java Books

🧠JAVA ИСПОЛЬЗУЙ TREESET ПРАВИЛЬНО #java

Если в Java нужно убрать дубликаты из списка и отсортировать элементы - используй TreeSet. Он автоматически удаляет повторяющиеся значения и сортирует их либо по естественному порядку, либо по кастомному правилу через Comparator.


Естественный порядок
List<String> colors = Arrays.asList("red", "green", "red", "orange", "turquoise");
Set<String> colorsSet = new TreeSet<>(colors);
for (String color : colorsSet) {
System.out.println(color);
}

Сортировка по длине строки
Comparator<String> byLength = Comparator.comparingInt(String::length);
Set<String> sortedSet = new TreeSet<>(byLength);
sortedSet.addAll(colors);
for (String color : sortedSet) {
System.out.println(color);
}

Читать полностью…

Java Books

PipedOutputStream

PipedOutputStream используется для организации потоковой передачи данных между потоками.

Он работает совместно с PipedInputStream. Один поток записывает данные в PipedOutputStream, а другой считывает их из соответствующего PipedInputStream.
Это позволяет организовать обмен данными между потоками по принципу "производитель-потребитель".

Для связи PipedOutputStream и PipedInputStream нужно использовать метод connect().
Метод write() используется для записи данных, как и в обычных потоках вывода.

PipedOutputStream полезен, когда нужен простой способ организовать обмен данными между потоками в одной программе.
Он часто используется для подключения вывода одного потока к вводу другого.

#это_база

Читать полностью…

Java Books

☕ Java Tip: рекурсивный обход файловой системы

В 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)
.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}


Что происходит:

• Files.walk(startPath) - рекурсивно проходит по всем папкам
• filter(Files::isRegularFile) - оставляет только файлы
• endsWith(".java") - фильтр по расширению
• forEach - обработка найденных файлов

Это намного чище, чем писать собственную рекурсивную функцию обхода директорий.

#Java #JavaDev #Programming

⚡️ Полезные ресурсы по Java 🚀 Max

@javatg

Читать полностью…

Java Books

🖥 Resilience4j - библиотека для Java, которая помогает сделать микросервисы устойчивыми к сбоям и перегрузкам.

В распределённых системах ошибки — это норма:

* внешние сервисы падают
* запросы зависают
* API начинают тормозить
* нагрузка резко растёт

Если не контролировать такие ситуации, один нестабильный сервис может «уронить» всю систему.

Resilience4j решает эту проблему с помощью набора паттернов отказоустойчивости.

Основные компоненты:

Circuit Breaker
Отслеживает частоту ошибок и временно блокирует обращения к нестабильному сервису, чтобы дать ему восстановиться.

Rate Limiter
Ограничивает количество запросов и защищает систему от перегрузки.

Retry
Автоматически повторяет запросы при временных сбоях, с настройкой числа попыток и интервалов.

Bulkhead
Ограничивает количество параллельных вызовов или потоков, чтобы сбой в одной части не заблокировал ресурсы всей системы.

TimeLimiter
Устанавливает таймауты выполнения, чтобы не ждать слишком долго ответы от внешних сервисов.

Почему это важно:

В микросервисной архитектуре надёжность — это не отсутствие ошибок,
а способность системы правильно на них реагировать.

Resilience4j — лёгкая, модульная библиотека с лицензией Apache-2.0, которая помогает строить стабильные и предсказуемые распределённые системы.

https://github.com/resilience4j/resilience4j

Читать полностью…

Java Books

🚀 Spring Boot: не отдавайте JPA Entity напрямую в API - используйте DTO на границах

Если возвращать Entity из контроллера, вы жёстко связываете API с внутренней моделью базы. Любое изменение в persistence-слое может сломать внешний контракт.

DTO решает сразу несколько проблем:

• API становится независимым от слоя данных
• Избегаете ошибок LazyInitializationException
• Не утечёт лишняя информация (например, password, internalNote)
• Улучшается безопасность и контроль над тем, что видит клиент

Идея простая:
Entity - для базы
DTO - для API

Конвертируйте Entity → DTO в сервисе или через mapper (MapStruct / manual mapping).

Чистые границы = стабильный API и меньше багов.

#SpringBoot #Java #Backend #SoftwareEngineer

Читать полностью…

Java Books

💡 Java-совет: давайте каждому потоку своё значение по умолчанию

Если у вас многопоточное приложение и нужно хранить данные отдельно для каждого потока — используйте ThreadLocal.withInitial(...).

Что это даёт:
- У каждого потока своя независимая копия переменной
- Не нужны синхронизация и блокировки
- Значение создаётся лениво — только при первом обращении

Пример:


ThreadLocal<Integer> counter =
ThreadLocal.withInitial(() -> 0);

counter.get(); // 0
counter.set(70);
counter.get(); // 70

Читать полностью…

Java Books

⚡️ grep по-настоящему - практическое руководство с примерами

Если вы используете grep только для простого поиска по файлам — вы теряете половину его возможностей.

Разбор *grep by example* — это набор реальных сценариев, которые показывают, как использовать инструмент для повседневных задач разработчика и DevOps.

Что можно делать с grep

- Поиск по нескольким файлам и каталогам
- Фильтрация логов и больших текстов
- Поиск по шаблонам и регулярным выражениям
- Игнорирование регистра
- Подсветка совпадений
- Показ строк до и после совпадения

Полезные примеры

Поиск слова во всех файлах:

antonz.org/grep-by-example/

Читать полностью…

Java Books

⚡️ Spring Boot умеет валидировать входные DTO буквально парой аннотаций - без ручных if и простыней кода.

Вместо самописных проверок используем Bean Validation прямо в модели запроса.

Пример DTO:

- @Email — проверяет формат почты
- @NotBlank — поле обязательно
- @Size(min, max) — ограничения длины
- @Pattern — проверка по regex

Spring автоматически:

- валидирует входящий JSON
- при ошибке возвращает 400 Bad Request
- формирует понятный список ошибок в ответе

То есть API сразу становится “самозащищающимся” от кривых данных.

Важно: логику валидации мы держим рядом с данными, а не размазываем по контроллерам.

Если нужно — формат ответа с ошибками можно полностью переопределить через глобальный exception handler.

Итог: меньше бойлерплейта, чище контроллеры и предсказуемое поведение API.

Читать полностью…

Java Books

🚀 Spring совет: таймауты RestTemplate лучше настраивать централизованно

Если в проекте много REST-запросов через RestTemplate, не разбрасывай таймауты по коду.

✅ Правильнее сделать конфигурацию через RestTemplateBuilder:

- один общий RestTemplate с дефолтными timeout
- плюс отдельные клиенты под “медленные” сервисы (через `@Qualifier`)

Так у тебя:
- единая точка настройки
- меньше багов в проде из-за “вечных” запросов
- проще дебажить и менять параметры

💡 Особенно полезно в микросервисах, где внешние сервисы могут подвисать.

#SpringBoot #JavaDev

Читать полностью…

Java Books

☕️ Spring Boot лайфхак: как не отправлять null поля в JSON

Если ваш API отдаёт JSON и там постоянно летят поля вида:


"phone": null,
"email": null

это:

- засоряет ответы
- увеличивает трафик
- мешает фронту (лишние проверки)

Решение - сказать Jackson: не сериализовать null-поля.

Достаточно добавить аннотацию на DTO:

✅ @JsonInclude(JsonInclude.Include.NON_NULL)

После этого все поля со значением null автоматически исчезнут из JSON-ответа.

Плюс: это особенно удобно для PATCH/частичных ответов.

Читать полностью…

Java Books

PostgreSQL: архитектура и тюнинг SQL-запросов

Погрузись в архитектуру и прокачай оптимизацию запросов одной из самых популярных open source СУБД – PostgreSQL.

🌐 В программе курса:

🤩 Разберем, как работают СУБД вообще и PostgreSQL в частности: что такое MVCC, ACID, WAL, LRU, PPC/TPC и другие фундаментальные понятия архитектуры баз данных

🤩 Получите теорию и практику EXPLAIN и EXPLAIN ANALYZE на разных типа запросов: без индексов, с индексами, index only, нормализованные и документ-ориентированные данные и json-поля, изменение параметров сессии/конфигурации для ускорения запросов

🤩 Изучите архитектуру хранения данных в PostgreSQL, типы и особенности индексов, а также получите полезные советы и трюки оптимизации БД

🤩 Получите свой собственный выделенный облачный PostgreSQL-сервер (8 vCPU, 12G RAM, 100G NVMe) – предоставляется БЕСПЛАТНО на время обучения + готовый e-commerce датасет TPC-H (миллион пользователей, несколько миллионов заказов на десятки гигабайт)

🗓 Старт курса: 22 января. 5 недель обучения.

Изучить программу и записаться можно здесь.

🤩Кто мы: R&D-центр Devhands, основатель школы Алексей Рыбак. Автор курса — Николай Ихалайнен, эксперт по СУБД (ex-Percona), со-основатель MyDB, энтузиаст открытого ПО.

Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqvHatG2

Читать полностью…

Java Books

🔥 JAVA ПРОЕКТ ЗА 2 МИНУТЫ

Перед стартом делай правильно:
- Gradle/Maven сразу (без ручных jar)
- структура src/main/java + src/test/java
- JUnit + тесты с первого дня
- Checkstyle/Spotless чтобы код-стайл был единый
- .env / config для настроек (не хардкодь URL/ключи)

Так проект не развалится, когда станет больше 2 файлов.

Сохраняй себе это - и используй каждый раз, когда начинаешь новый Java-проект.



# Gradle проект с авто-структурой
mkdir my_java_app && cd my_java_app
gradle init --type java-application --dsl groovy --test-framework junit-jupiter

# быстрый запуск + тесты
./gradlew test
./gradlew run

Читать полностью…

Java Books

🖥 Java: `Stream.peek()`- только для отладки

Есть простой принцип, который часто ломают.

peek() — не для логики.
Его задача — подсмотреть, что проходит по конвейеру, и помочь отладке.

Пример — посмотреть, как меняются данные по шагам:


list.stream()
.filter(x -> x > 10)
.peek(x -> System.out.println("Filter: " + x))
.map(x -> x * 2)
.peek(x -> System.out.println("Map: " + x))
.toList();

Вот, как это работает:

- filter() — отбрасывает лишнее
- peek() — просто печатает, ничего не меняя
- map() — преобразует значения

Почему важно не класть туда «настоящую» логику:

- peek() могут удалить или отключить
- порядок выполнения потоков может меняться
- код становится хрупким и непредсказуемым

Коротко:
- нужен вывод - используй peek().
- нужна логика - используй map(), filter() и другие операторы.

Читать полностью…

Java Books

🖥 На Stepik вышел курс, который учит работать с Docker на реальных проектах.

Владение Docker - навык, который отличает новичка от профи

Сегодня почти всё разворачивается в контейнерах.

Если ты не умеешь работать с Docker, ты медленнее, зависим от чужих настроек и постоянно ловишь баги «у меня локально работает».

Этот курс покажет:

• разобраны все возможные ошибки при работе c Docker
• как упаковывать проекты в контейнеры
• как поднимать целые системы за минуты
• как избегать типичных ошибок в продакшене
• как делать стабильные и повторяемые окружения

Только практика и реальные кейсы - с нуля до уверенного уровня.

🎁 40 процентов скидка действует 48 часов в честь нового года


👉 Записывайся и сделай Docker своим настоящим рабочим инструментом.

Читать полностью…

Java Books

💡 Java совет: рекурсивная обработка файлов с Files.walk()

Если нужно пройтись по всем файлам в директории и её подкаталогах, не пиши рекурсию вручную — используй Files.walk().

Пример: найти все `.java`-файлы в проекте


Path startPath = Paths.get("src");

try (Stream<Path> paths = Files.walk(startPath)) {
paths
.filter(Files::isRegularFile)
.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}


Почему это хороший подход:

- Рекурсивный обход «из коробки»
- Работает через Stream API
- Легко фильтровать, маппить и агрегировать
- Автоматически закрывает ресурсы (try-with-resources)

Полезно для:

- анализа исходников
- линтеров и кодогенерации
- поиска файлов по расширению
- утилит и dev-скриптов

#Java #IO

Читать полностью…

Java Books

💡 Java совет:

Начиная с Java 19, можно использовать *виртуальные потоки* - лёгкие потоки, которые управляются самой JVM, а не операционной системой.

Что это даёт:

- можно запускать тысячи и даже миллионы задач без нагрузки на ОС
- проще писать высоконагруженные приложения без сложной асинхронности
- более понятный и чистый код по сравнению с CompletableFuture и callback-подходами

Виртуальные потоки — главный шаг Java к масштабируемой конкурентности.

#Java #JavaDev

Читать полностью…
Subscribe to a channel