Java Portal | Программирование
13K subscribers
1.01K photos
78 videos
33 files
834 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Бесплатный API для получения полной информации об IP-адресе.

Без регистрации и каких-либо ограничений.

Работает с Python, JavaScript, Java, PHP, Go и другими языками.

Пример использования: https://api.ipquery.io/1.1.1.1

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4🌚4🤔2
Проект многопоточный загрузчик файлов на Java отлично подходит для изучения

Учит разбираться в многопоточности и конкурентности

Прокачивает навыки в:

> работе с данными
> файловом вводе-выводе
> многопоточности
> конкурентности
> работе с диапазонами Content-Length в HTTP-запросах

и не только 💪

Вот один из проектов к примеру: https://github.com/winnerx0/java-project-box

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍3🔥1
Media is too big
VIEW IN TELEGRAM
Научись создавать проекты с нуля на любом языке программирования

Репо: https://github.com/practical-tutorials/project-based-learning

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥1
Метод limit в Java Stream API кратко

Иногда нужно вытащить только первые N элементов коллекции например для пагинации отладки или быстрого превью. В Stream API за это отвечает limit который делает это простым и аккуратным способом

limit(long maxSize) создает новый поток и берет не больше n элементов из исходного. Остальные элементы пропускаются и дальше не обрабатываются

Пример ниже

  import java.util.List;
import java.util.stream.Collectors;

public class LimitExample {
public static void main(String[] args) {
List<String> items = List.of("A", "B", "C", "D", "E");

List<String> limited = items.stream()
.limit(3)
.collect(Collectors.toList());

System.out.println(limited); // [A, B, C]
}
}


Какой бы ни была длина исходной коллекции результат содержит максимум n элементов

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Паттерны проектирования систем - шпаргалка

🔸Webhooks и Outbox
Надёжные внешние уведомления.
Когда использовать — интеграции, сторонние колбэки.
Типичные проблемы — статусы оплат, синхронизация CRM.

🔸Blob/Object Storage
Дешёвое хранение больших файлов.
Когда использовать — медиа, бэкапы, экспорты.
Типичные проблемы — загрузки пользователей, data lake.

🔸Оркестратор задач (Airflow/Temporal)
Долгоживущие процессы с состоянием.
Когда использовать — длинные задачи, SLA.
Типичные проблемы — генерация отчётов, обработка видео.

🔸Blue-Green / Canary деплой
Постепенное переключение трафика.
Когда использовать — безопасные релизы, быстрый откат.
Типичные проблемы — деплой API, смена конфигураций.

🔸Feature Flags
Включение/отключение фич на лету.
Когда использовать — эксперименты, переключатели.
Типичные проблемы — A/B тесты, скрытые релизы.

🔸Стратегия миграции схемы
Обратная/прямая совместимость.
Когда использовать — миграция без простоя БД.
Типичные проблемы — expand-migrate-contract.

🔸Распределённые блокировки / выбор лидера
Координация одного активного воркера.
Когда использовать — уникальность cron, шардовое владение.
Типичные проблемы — один консумер, лидер партиции.

🔸Наблюдаемость (логи/метрики/трейсы)
Понимание, что делает система.
Когда использовать — SLO, отладка, планирование.
Типичные проблемы — задержка p99, error budget.

🔸Безопасность: AuthN/AuthZ
Проверка личности и прав доступа.
Когда использовать — мультиарендные продукты, внешние API.
Типичные проблемы — OAuth2/OIDC, RBAC/ABAC.

🔸Мультиарендность (pool/bridge/isolated)
Уровни изоляции данных и ресурсов.
Когда использовать — SaaS с множеством клиентов.
Типичные проблемы — отдельные БД на арендатора vs общая схема.

🔸Edge Compute/функции
Запуск логики ближе к пользователю.
Когда использовать — низкая задержка, лёгкие задачи.
Типичные проблемы — персонализация на краю, A/B тесты.

🔸Rate-Aware DB Patterns
Пакетная, очередная, троттлинг у БД.
Когда использовать — горячие партиции, блокировки.
Типичные проблемы — массовый импорт, ID hotspot.

🔸Стратегии пагинации
Keyset > Offset для больших данных.
Когда использовать — бесконечный скролл, большие таблицы.
Типичные проблемы — пагинация фидов, списки в админке.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
This media is not supported in your browser
VIEW IN TELEGRAM
Кто до сих пор путается в деревьях, графах и сортировках, вот топчик:

https://visualgo.net/en

Визуалка чисто для мозга, всё анимировано: стек, очередь, DFS, BFS, сортировки, хэш-таблицы.

Как будто смотришь, как думает комп. Залипнуть можно. 😳

Сохрани

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
9
Освой планирование в Spring Boot с помощью Cron-задач и начальной задержки.

🔸Cron Job

Планировщик cron запускает задачи в определённое время, используя cron-выражение.

Это самый гибкий способ планировать задачи в Spring Boot — можно запускать их ежедневно, еженедельно, ежемесячно или по любому заданному шаблону.
Пример ниже выполняется каждый день в 9:00 утра по времени IST.

@Scheduled(cron = "0 0 9 * * ?", zone = "Asia/Kolkata")
public void runCron() {
System.out.println("Daily at 9:00 AM");
}


Формат cron: секунда минута час день месяц деньНедели

Примеры:

0 0 0 * * ? → каждый день в полночь

0 0/15 * * * ? → каждые 15 минут

Используйте cron, когда нужна точность, например для генерации отчётов в конце дня.

🔸Initial Delay

Параметр initialDelay говорит Spring Boot, сколько ждать после запуска приложения перед первым выполнением задачи.

После первого запуска задача будет работать с указанным fixedRate или fixedDelay.

Пример: код ниже ждёт 10 секунд после старта, затем выполняется каждые 5 секунд от начала предыдущего запуска.

@Scheduled(initialDelay = 10000, fixedRate = 5000)
public void runWithDelay() {
System.out.println("Starts after 10s, then every 5s");
}


Используйте initialDelay, если задача зависит от готовности других сервисов или данных — например, нужно загрузить конфигурацию из базы перед запуском фоновых задач.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
This media is not supported in your browser
VIEW IN TELEGRAM
8 лучших практик при проектировании API

① Понятные названия → единообразные URL и коллекции
② Идемпотентность → безопасные повторы запросов с одинаковым результатом
③ Пагинация → ограничение количества результатов для снижения нагрузки
④ Сортировка и фильтры → возможность фильтровать результаты
⑤ Кросс-ссылки → не злоупотреблять query string
⑥ Ограничение частоты запросов → контроль количества запросов для стабильности
⑦ Версионирование → сохранение обратной совместимости
⑧ Безопасность → защита через API Keys, JWT, OAuth2

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Java Logging (SLF4J, Logback) — всё, что нужно знать

1. Логирование → запись событий приложения для отладки и мониторинга
Помогает находить проблемы без запуска отладчика
Пример: запись неудачной попытки входа для целей безопасности

2. SLF4J → простой фасад для логирования в Java
Вы пишете код против API SLF4J, а дальше подключаете любую реализацию логгера
Пример: один и тот же код будет работать с Logback, Log4j или java.util.logging

3. Logback → популярный backend для логирования
Высокая производительность, гибкость, поддержка фильтров и политик ротации
Пример: запись логов в файл с ежедневной ротацией

4. Зачем использовать SLF4J + Logback
- SLF4J → возможность менять backend без переписывания кода
- Logback → функционал продакшен-уровня и высокая производительность

5. Уровни логирования (общие для большинства фреймворков)
- TRACE → подробная внутренняя информация (редко в продакшене)
- DEBUG → отладочная информация (например, значения переменных)
- INFO → общие события высокого уровня (например, «Пользователь успешно зарегистрирован»)
- WARN → неожиданные, но восстанавливаемые ситуации (например, повторный запрос)
- ERROR → критические ошибки, влияющие на функционал

6. Пример настройки

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyService {
private static final Logger logger = LoggerFactory.getLogger(MyService.class);

public void processOrder(String orderId) {
logger.info("Processing order {}", orderId);
try {
// бизнес-логика
} catch (Exception e) {
logger.error("Error processing order {}", orderId, e);
}
}
}


🔸Используйте параметризованное логирование
logger.debug("User {} logged in", userId) → избегайте конкатенации строк

🔸Выбирайте правильный уровень логов — не захламляйте прод debug-сообщениями

🔸Разделяйте логи приложения и фреймворков

🔸Применяйте политику ротации, чтобы не копились огромные файлы

🔸Добавляйте correlation ID для трейсинга запросов между сервисами

Не логируйте чувствительные данные (пароли, токены)

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113
This media is not supported in your browser
VIEW IN TELEGRAM
Чувак сделал несколько Live Templates для intellijidea, которыми часто пользуется

👉 https://github.com/sivaprasadreddy/intellij-live-templates

С каждой новой версией IntelliJ IDEA часть этих штук появляется прямо из коробки

Например, шаблоны для логов и создания Spring-компонентов уже доступны OOTB

На примере небольшой демо, как можно быстро создавать логгер и Spring-компоненты прямо в intellijidea

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62
Автоматический toString() в Record

record сравнительно новая фича в Java, которая позволяет описывать сущности без явного объявления полей и написания геттеров/сеттеров.

Пример:

record User(String name, int age, String city) { }


Если писать это же через класс, получится больше кода:

class User {
public String name;
public int age;
public String city;

public User(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
}


И в том и в другом случае мы получаем объект для хранения данных:

new User("Nick", 20, "New York");


Но есть отличие

У record метод toString() генерируется автоматически и выводит имена и значения всех полей в удобном формате.

В обычном классе дефолтный toString() возвращает имя класса и хэш объекта.

Пример:

record User(String name, int age, String city) { }

class SecondUser {
public String name;
public int age;
public String city;

public SecondUser(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
}

public static void main(String[] args) throws Exception {
User firstUser = new User("Nick", 20, "New York");
SecondUser secondUser = new SecondUser("Charley", 25, "New York");

System.out.println(firstUser);
System.out.println(secondUser);
}


Вывод:

User[name=Nick, age=20, city=New York]
org.example.SecondUser@68de145


То есть у record toString() сразу готов, а для обычного класса придётся переопределять вручную.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Ресурс для разработчиков, чтобы создавать изометрические диаграммы своей инфраструктуры или софта.

Open-source: https://github.com/stan-smith/FossFLOW

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3
Java Off-Heap Memory с DirectByteBuffer

Большинство Java-разработчиков работают только с объектами в куче JVM, управляемой Garbage Collector.

Но в системах с высокими требованиями к производительности — базах данных, игровых движках или messaging-системах — Java может использовать off-heap memory (память вне кучи JVM) через DirectByteBuffer

Преимущества

- снижение пауз GC
- ускорение I/O операций
- возможность работать с большими наборами данных без раздувания кучи

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Репозиторий kdn251/interviews на GitHub — это реально крутой ресурс, собранный Кевином Нонтоном

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

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

Там найдёшь задачи, видео, объяснения, ссылки на LeetCode и много практики 😁

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21
Советы по работе с Spring Boot Scheduler

Пул потоков

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

Чтобы запускать задачи параллельно, увеличь пул:

spring.task.scheduling.pool.size=4


Теперь одновременно могут работать до 4 задач.

Быстрая проверка

Во время разработки ставь короткие интервалы и добавляй логи, чтобы видеть, когда реально запускается job:

log.info("Job ran at {}", Instant.now());


Частые ошибки

- забыли @EnableScheduling → задачи не запустятся

- неверный timezone в cron

- долгие задачи блокируют другие (решается увеличением пула или оптимизацией кода)

Выбираем стратегию

fixedRate → с фиксированными интервалами

fixedDelay → ждёт после выполнения

cron → точные даты и время

Совет: выноси настройки во внешние properties и используй пул потоков для стабильной работы.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
🔍 Завтра тестовое собеседование с Java-разработчиком

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

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

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

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

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Первая статья из серии, где показывается как примеры AI-агентов из популярных Python-фреймворков можно переписать на Java и сделать гораздо лучше с помощью Embabel

Сегодняшняя цель CrewAI — читать

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7🌭3🤣3😁1🤯1
Интеграция ChatGPT в Java

С ростом интереса к нейросетям всё больше приложений начинают использовать ИИ в своей бизнес-логике. Встраивание ChatGPT может быть реализовано по-разному

1. Пользователь вводит текст, приложение отправляет его в ChatGPT и возвращает ответ
2. Ввод отправляется в ChatGPT для дополнения или расширения и сохраняется в базу
3. ChatGPT используется как помощник для следующих действий пользователя

Механика всегда одна и та же: отправляется HTTP-запрос к API, на который приходит HTTP-ответ. Браузер делает это напрямую, Java-код делает то же самое с любым HTTP-клиентом — RestTemplate, WebClient, HttpClient, OkHttp и т д

Отличие в том, что запросы из приложения должны содержать ваш API-ключ. Его передают в заголовке Authorization

Как подготовить проект

1. Зарегистрироваться на platform.openai.com, сгенерировать API Key в разделе API Keys
2. Подключить зависимости. Например, OkHttp для запросов и org.json для разбора ответа

<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20240303</version>
</dependency>
</dependencies>


Пример простого клиента

import okhttp3.*;
import org.json.JSONObject;

public class ChatGPTClient {
private static final String API_KEY = "your-api-key-here";
private static final String API_URL = "https://api.openai.com/v1/chat/completions";

public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();

JSONObject message = new JSONObject()
.put("role", "user")
.put("content", "Привет! Объясни, как работает JVM");

JSONObject body = new JSONObject()
.put("model", "gpt-3.5-turbo")
.put("messages", new org.json.JSONArray().put(message));

Request request = new Request.Builder()
.url(API_URL)
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.post(RequestBody.create(body.toString(), MediaType.get("application/json")))
.build();

try (Response response = client.newCall(request).execute()) {
JSONObject json = new JSONObject(response.body().string());
String reply = json.getJSONArray("choices")
.getJSONObject(0)
.getJSONObject("message")
.getString("content");
System.out.println("ChatGPT ответ: " + reply);
}
}
}


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

> создаём HTTP-клиент
> формируем JSON с сообщением
> добавляем заголовки и ключ
> отправляем POST-запрос на API
> парсим JSON-ответ и выводим текст

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🤯2
7 шаблонов проектирования, которые должен знать каждый разработчик

Осознаёте вы это или нет, но большинство этих шаблонов вы уже используете.

Шаблоны проектирования — это переиспользуемые решения типовых задач в программировании. Они служат шаблонами, которые можно применять в разных языках и на разных платформах.

В 1994 году четверо разработчиков, известные как Gang of Four (Банда четырёх), написали книгу, где описали 23 шаблона проектирования. Эта книга стала классикой, и описанные в ней подходы актуальны до сих пор.

Шаблоны делятся на три группы:

🟢Порождающие — управляют созданием объектов с гибкостью.
🟣Структурные — помогают организовать объекты в более крупные структуры.
🟡Поведенческие — определяют, как объекты взаимодействуют друг с другом.

Вот 7 ключевых шаблонов, которые стоит знать:

Singleton — гарантирует, что будет только один экземпляр класса.

Builder — пошагово конструирует сложные объекты.

Factory — создаёт объекты без указания точного класса.

Facade — упрощает работу со сложной системой через единый интерфейс.

Adapter — позволяет работать вместе несовместимым интерфейсам.

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

Observer — поддерживает зависимость между объектами (реакция на события).


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

Но важно помнить: не злоупотребляйте ими. Подходящий шаблон в нужной ситуации — это сила. Но если применять их там, где они не нужны, это только усложнит систему.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52