Java Ready | Программирование
8.91K subscribers
1.21K photos
60 videos
1 file
596 links
Авторский канал по разработке на Java.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

Реклама на бирже: https://telega.in/c/java_ready
Download Telegram
👩‍💻 Optional — способ сделать null безопасным и контролируемым!

Вместо скрытых проверок и неожиданных NullPointerException код становится явным: значение либо есть, либо его нет. Это упрощает чтение логики и уменьшает количество защитных условий.

Правильное использование Optional делает API понятнее и безопаснее. Метод сразу показывает, что результат может отсутствовать, а цепочка вызовов позволяет обрабатывать этот случай аккуратно.


👉 Java Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥7👍6🤝3
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ Tutorials от Oracle — настоящая база знаний по Java!

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

📌 Оставляю ссылочку: oracle.com

👉 Java Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍10🔥7
Timeout wrapper для операций!

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

Создаём пул потоков для выполнения задач:
var pool = java.util.concurrent.Executors.newSingleThreadExecutor();


Оборачиваем операцию в Future:
var future = pool.submit(() -> {
Thread.sleep(2000); // имитация долгой операции
return "Готово";
});


Пытаемся получить результат с таймаутом:
try {
var result = future.get(1, java.util.concurrent.TimeUnit.SECONDS);
System.out.println(result);
}


Если время вышло прерываем задачу:
catch (java.util.concurrent.TimeoutException e) {
future.cancel(true);
System.out.println("Операция превысила лимит времени");
}


Не забываем завершить пул потоков:
pool.shutdown();


Теперь любая операция может выполняться с ограничением по времени.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍4🔥4
Выявление мошеннических транзакций с помощью ML!

Детекция мошеннических операций — одна из основных задач финтех-систем. Модель должна оценивать риск транзакции и выявлять подозрительную активность в потоке платежей.

Установка библиотек:
pip install pandas scikit-learn


Будем использовать pandas для работы с данными и scikit-learn для построения модели.

Импорт модулей:
import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report


Мы будем использовать пайплайн, который объединяет предобработку и модель — это стандартная практика для воспроизводимости и предотвращения утечек данных.

Пример структуры данных (учебный):
data = pd.DataFrame({
"amount": [12, 35, 60, 15, 22, 40, 2500, 4200, 5000, 3600],
"hour": [14, 18, 12, 10, 16, 19, 3, 2, 1, 2],
"is_foreign": [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
"transactions_last_24h": [2, 3, 1, 2, 2, 3, 15, 20, 25, 18],
"fraud": [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
})


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

Разделим данные на признаки и целевую переменную:
X = data.drop(columns=["fraud"])
y = data["fraud"]


Теперь модель будет учиться предсказывать fraud на основе остальных признаков.

Разделим данные на обучающую и тестовую выборки:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)


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

В антифроде логистическая регрессия часто используется как базовая модель: она быстрая, понятная и умеет оценивать вероятность мошенничества. Чтобы учесть дисбаланс классов, зададим веса.

Обучим модель в составе пайплайна:
model = Pipeline(steps=[
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=1000, class_weight="balanced"))
])

model.fit(X_train, y_train)


StandardScaler нормализует числовые признаки, что улучшает сходимость линейных моделей.

Оценка качества модели:
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))


Отчёт показывает precision, recall и F1-меру для каждого класса. На малых данных, метрики приведены исключительно в демонстрационных целях.

Пример оценки новой транзакции:
tx = pd.DataFrame([{
"amount": 3200,
"hour": 2,
"is_foreign": 1,
"transactions_last_24h": 18
}])

risk = model.predict_proba(tx)[0][1]
print("Вероятность мошенничества:", round(risk, 2))


Модель возвращает вероятность fraud, которую можно использовать для принятия решения.

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

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍7👎5🔥5😁1
📂 Напоминалка по Java Collections Framework!

Например, ArrayList используется для динамических массивов и быстрого доступа по индексу, а HashSet позволяет хранить только уникальные элементы без повторений.

На картинке — иерархия основных интерфейсов и реализаций Java-коллекций. Такая схема помогает быстро вспомнить, какая структура данных подходит для конкретной задачи.

Сохрани, чтобы не забыть!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍9🔥6
👩‍💻 Spliterator — механизм, на котором построены потоки данных в Java!

Он позволяет обходить коллекции и при необходимости делить их на части для параллельной обработки. Это делает работу Stream API эффективной и масштабируемой, особенно при обработке больших наборов данных.

Понимание Spliterator помогает лучше разобраться в том, как Java оптимизирует итерацию и распределяет задачи между потоками. Даже если вы используете только Stream API, именно этот интерфейс выполняет основную работу под капотом.


👉 Java Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥114👍4
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ JavaCodeGeeks — крутой портал со статьями и практикой для Java-разработчиков!

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

📌 Оставляю ссылочку: javacodegeeks.com

👉 Java Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥87👍5🤝2
📂 Разбираемся, как работают Python и Java!

На иллюстрации показано, как оба языка обрабатывают код: от редактора и компиляции до выполнения программы.

Python использует интерпретатор и виртуальную машину PVM, а Java — компилятор javac, байткод и JVM с JIT-компиляцией.

Сохрани, чтобы не забыть!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍65
📂 Напоминалка по сетевым протоколам!

Например, DNS отвечает за преобразование доменных имен в IP-адреса, TCP обеспечивает надежное соединение и порядок доставки пакетов, а HTTP используется для обмена запросами и ответами между клиентом и сервером.

На картинке — основные сетевые протоколы и уровни, которые участвуют в передаче данных.

Сохрани, чтобы не потерять!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥8👍6
Перечитывание конфигов без рестарта!

Сделаем простой reload: читаем .properties и обновляем значения в памяти.

Указываем путь к конфиг-файлу:
var path = java.nio.file.Path.of("config.properties");
var props = new java.util.Properties();


Функция загрузки настроек из файла:
void load() throws Exception {
try (var in = java.nio.file.Files.newInputStream(path)) {
props.clear();
props.load(in);
}
}


Читаем конкретный параметр из конфига:
String get(String key) {
return props.getProperty(key);
}


Перезагружаем конфиг в любой момент:
load();
System.out.println("port=" + get("server.port"));


Пример файла config.properties:
server.port=8080
feature.newLogin=true
limit.requests=100


Теперь настройки можно менять прямо в файле, не перезапуская приложение. Достаточно вызвать load() и новые значения сразу применятся. Так работают динамические конфиги в реальных сервисах.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍4🔥4
Чат по локальной сети

Создаём самый простой вариант чат, один компьютер запускает сервер, второй клиент, и они обмениваются сообщениями по Socket.

Сервер ждёт подключение:
ServerSocket server = new ServerSocket(5000);
Socket socket = server.accept();
System.out.println("Клиент подключился");


Клиент подключается по IP:
Socket socket = new Socket("192.168.0.10", 5000);
System.out.println("Подключено к серверу");


Читаем сообщения от собеседника:
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);


Отправляем свои сообщения:
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Привет из клиента!");


Чтобы чат работал постоянно, один поток читает, второй пишет:
new Thread(() -> {
while (true) System.out.println(in.readLine());
}).start();


Основной поток отправляет то, что вводишь в консоль:
Scanner sc = new Scanner(System.in);
while (true) out.println(sc.nextLine());


В итоге получается уже настоящий чат по локалке,
один ПК запускает сервер, второй подключается по IP, и сообщения ходят в обе стороны в реальном времени.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥8👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Perplexity — AI-поисковик с генеративной моделью и встроенным web-ресёрчем. Работает по RAG-архитектуре: ищет актуальные источники, ранжирует их и формирует синтезированный ответ с цитированием. Подходит для быстрого ресёрча, конкурентного анализа, сравнения решений и проверки гипотез на основе свежих данных.

📌 Оставляю ссылочку: perplexity.ai

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍98🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
💡 StartJava — курс по Java с пошаговым разбором фундаментальных тем!

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

Оставляю ссылочку: GitHub 📱


👉 Java Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
13🔥7👍6🤝1
2048 в консоли!

Игра 2048 это поле 4×4, где одинаковые числа объединяются при движении. Игрок двигает плитки, числа складываются, а после каждого хода появляется новая плитка.

Создаём игровое поле 4×4:
int[][] board = new int[4][4];


Функция для печати поля:
void print() {
for (var r : board) {
for (var c : r) System.out.printf("%4d", c);
System.out.println();
}
}


Добавляем случайную плитку (2 или 4):
var rnd = new java.util.Random();
int x = rnd.nextInt(4), y = rnd.nextInt(4);
board[x][y] = rnd.nextDouble() < 0.9 ? 2 : 4;


Движение плиток влево:
for (int i = 0; i < 4; i++) {
for (int j = 1; j < 4; j++) {
if (board[i][j] != 0 && board[i][j - 1] == 0) {
board[i][j - 1] = board[i][j];
board[i][j] = 0;
}
}
}


Пробуем один игровой ход:
print();
System.out.println("Движение влево");


Пример поля:
   2   0   0   0
4 2 0 0
0 0 2 0
0 0 0 0


Получается простая версия 2048 прямо в терминале, которая идеально подходит для разработки новичком.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍4🔥4👎1