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

Автор: @energy_c

Реклама на бирже: https://telega.in/c/java_ready
Download Telegram
📂 Шпаргалка по операциям с массивами!

Выражение arr[i] используется для доступа к элементу массива по индексу. Запись arr[i] = value изменяет значение элемента по указанному индексу.

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

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

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥104👍2
Почему isBlank() часто полезнее, чем isEmpty()?

В Java строки можно проверять по-разному.

Например, isEmpty() проверяет только длину строки:
"".isEmpty();      // true
" ".isEmpty(); // false


То есть строка из пробелов для isEmpty() уже не пустая.

А в пользовательском вводе такое встречается постоянно: имя, комментарий, email, заголовок, поле поиска.

Для таких случаев лучше подходит isBlank():
"".isBlank();      // true
" ".isBlank(); // true
"\n\t".isBlank(); // true


isBlank() считает строку пустой, если в ней нет видимых символов.

Поэтому проверка становится надёжнее:
if (name == null || name.isBlank()) {
name = "Guest";
}


Если проверяешь пользовательский текст, isBlank() часто безопаснее, чем isEmpty().

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥5👍3
😎 Полезная статья про realtime push-уведомления на Java без WebSocket!

В этой статье:
• Чем SSE отличается от polling и WebSocket
• Как сделать подписку клиента через text/event-stream
• Зачем Redis нужен для хранения подписок пользователей


Продолжай читать на Habr!


👉 Java Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥3
👩‍💻 GraalVM Native Image — билдим Java в exe, который стартует за миллисекунды, ест в разы меньше памяти и не требует JVM на сервере!

Идеально для CLI, serverless и микросервисов.
Используй native-image, настраивай reflection-config.json и удивляйся, как твой код запускается быстрее Python-скрипта.


👉 Java Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍43
👍65🔥4👎1😁1
Когда собираешь Map через Stream API подумай про дубликаты ключей!

В Java часто нужно превратить список объектов в Map.

Например, есть пользователи, и хочется получить словарь id -> name:
Map<Long, String> usersById = users.stream()
.collect(Collectors.toMap(User::id, User::name));


Код выглядит нормально, пока в списке нет двух пользователей с одинаковым id.

Если дубликат появится, Java выбросит:
IllegalStateException: Duplicate key


Поэтому, если дубликаты возможны, лучше сразу указать merge-функцию:
Map<Long, String> usersById = users.stream()
.collect(Collectors.toMap(
User::id,
User::name,
(oldName, newName) -> newName
));


Здесь при совпадении ключей останется новое значение.

Можно сделать наоборот:
(oldName, newName) -> oldName


Тогда сохранится первое значение.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍5🔥4
📂 Шпаргалка по примитивным и ссылочным типам!

Примитивные типы хранят значение напрямую в переменной и работают без объектов. Ссылочные типы хранят ссылку на объект, при этом сам объект размещается в heap, а переменная указывает на него.

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

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

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍65
Ищем самый дорогой товар через Stream API!

Допустим, есть список товаров, и нужно найти позицию с максимальной ценой.

Создадим простую модель:
record Product(String name, BigDecimal price) {}


Подготовим данные:
List<Product> products = List.of(
new Product("Keyboard", new BigDecimal("79.99")),
new Product("Mouse", new BigDecimal("39.99")),
new Product("Monitor", new BigDecimal("249.99"))
);


Можно пройтись циклом и вручную хранить текущий максимум:
Product top = products.get(0);
for (Product product : products) {
if (product.price().compareTo(top.price()) > 0) {
top = product;
}
}


Но через Stream API это можно сделать короче:
Optional<Product> top = products.stream()
.max(Comparator.comparing(Product::price));


Comparator.comparing(Product::price) говорит Java сравнивать товары по цене.

А max() возвращает Optional, потому что список может быть пустым.

Поэтому результат лучше обработать явно:
Product product = top.orElseThrow();


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

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3🔥3
👩‍💻 Проверяем, все ли скобки закрыты?

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

Сегодня в посте:
Зададим строку;

Посчитаем количество для каждого вида скобок;

Проверим, что все счётчики равны нулю.


Такой способ подходит для простых проверок строк, где важен сам факт закрытия скобок, а не порядок.

👉 Java Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍32🤝1
Почему Collections.unmodifiableList() не всегда делает список неизменяемым?

На первый взгляд такой код надёжно защищает коллекцию:

var source = new ArrayList<>(List.of("Java", "C++"));
var languages = Collections.unmodifiableList(source);
source.add("C#");
System.out.println(languages);


Через languages действительно нельзя вызвать add() или remove(): Java выбросит UnsupportedOperationException.

Но unmodifiableList() не создаёт отдельную коллекцию. Он возвращает только неизменяемое представление исходного списка.

Поэтому изменение source будет видно и через languages. В примере программа выведет:

[Java, C++, C#]


Если нужна независимая неизменяемая копия, лучше использовать List.copyOf():

var languages = List.copyOf(source);


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

Стоит учитывать ещё одну деталь: List.copyOf() не допускает null-элементы и сразу выбросит NullPointerException, если они есть в исходной коллекции.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍5🔥3
📂 Напоминалка по Java Collections Framework!

Например, HashMap позволяет получать данные по ключу, а ArrayList обеспечивает удобную работу с динамическими списками и доступом по индексу.

На картинке — основные коллекции: List, Set, Queue, Map, их реализации (ArrayList, HashSet, TreeMap, HashMap и другие), особенности хранения данных, поддержка дубликатов, порядок элементов, основные методы и оценка сложности операций.

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

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥7👍6
Генерируем безопасный URL-токен на Java!

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

Создадим генератор случайных байтов:
private static final SecureRandom RANDOM =
new SecureRandom();


Теперь напишем метод генерации:
static String generateToken(int size) {
byte[] data = new byte[size];
RANDOM.nextBytes(data);

return Base64.getUrlEncoder()
.withoutPadding()
.encodeToString(data);
}


URL Encoder не использует символы, которые могут сломать адрес. Дополнительное кодирование результата не требуется.

Создадим токен из 32 случайных байтов:
String token = generateToken(32);
System.out.println(token);


Пример результата:
Pp1HgxVmySpQJQi3KUUPN5ZXqCV4-ZPvP12Ft49XiI0


Теперь его можно добавить в ссылку:
String link =
"https://ready.com/confirm?token=" + token;


На сервере безопаснее хранить хеш токена:
var digest = MessageDigest.getInstance("SHA-256");

byte[] hash = digest.digest(
token.getBytes(StandardCharsets.UTF_8)
);


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

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