Java | Фишки и трюки
Відкрити в Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
Показати більше6 953
Підписники
-324 години
-27 днів
+630 день
Архів дописів
6 953
⌨️ Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode()?
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться. Для этого необходимо использовать уникальные, лучше всего примитивные поля, например, такие как id, uuid. При этом нужно следовать правилу, если поля задействованы при вычислении
hashCode(), то они должны быть задействованы и при выполнении equals().
#java #hashCode #equals6 953
Курсы JAVA-разработки Гарантия ЗП от 120 000р в договоре
Jаvа — это язык, на котором строятся банковские системы, мобильные приложения, крупные веб-сервисы и многое другое, а спрос на Jаvа-разработчиков стабильно высок. Благодаря кроссплатформенности и надежности, ты сможешь работать в любой сфере IТ — от финансов до Коммерческой отрасли.📊💰
Почему это работает?✨
- Минимальные вложения.
- Тысячи человек уже в IТ. Наши выпускники работают в крутых компаниях: от стартапов до международных корпораций.
- Наши менторы — это опытные разработчики, которые ежедневно работают в IТ и готовы делиться актуальными знаниями.
P.S. Если всё ещё сомневаешься и думаешь что будет сложно — просто попробуй.😊
Мы берем на себя все риски: ты оплачиваешь основную стоимость обучения только после успешного трудоустройства — это закреплено в договоре.
Подать заявку
#реклама 16+
kata.academy
О рекламодателе
6 953
⌨️
var в Java 10+: удобство или ловушка?
Java 10 принес с собой var — возможность объявлять переменные без явного указания типа. Это делает код короче, но может иметь последствия.
Пример:
var list = new ArrayList<String>();
➡️ Компилятор сам выводит тип. Вроде удобно. Но давай разберем плюсы и минусы.
✔️ Плюсы использования var:
1. 👍 Меньше шаблонного кода
Не надо повторять длинные типы:
var map = new HashMap<String, List<Integer>>();
2. 👍 Лучшая читаемость при очевидных типах
Когда справа всё ясно — var делает код чище.
3. 👍 Удобно для циклов
for (var entry : map.entrySet()) { ... }
➡️ особенно в сочетании с лямбдами и stream API.
⚠️ Подводные камни:
1. 🟢 Потеря явности типа
var result = someMethod(); // Что за тип?
➡️ Нужно смотреть реализацию метода или IDE-подсказки.
2. 🟢 Повышается риск ошибок
Пример: можно случайно получить Object, если возвращается не тот тип.
3. 🟢 Плох для публичного API
В методах и сигнатурах var использовать нельзя — и это правильно: API должно быть прозрачным.
📌 Лучшие практики:
✔️ Используй var, когда тип очевиден
❌ Избегай в сложных выражениях с неочевидным выводом типа
❌ Не используй в публичных API или при работе в больших командах без согласованных правил
🗣️ Запомни: var — это инструмент, не костыль. Он не делает Java динамической. Используй его с умом — для читаемости, а не ради моды.6 953
⚠️ 7.834.500₽ - бесплатно! ⚠️
На сегодняшний день это самый крупный сборник слитых курсов в снг, по таким языкам как:
>Python (564гб курсов, 332гб видео)
>C# (127гб курсов, 82гб видео)
>Java (345гб курсов, 223гб видео)
>PHP (134гб курсов, 217гб видео)
>Go (223гб курсов, 79гб видео)
>Rust (187гб курсов, 149гб видео)
>SQL (341гб курсов, 127гб видео)
>MySQL (221гб курсов, 134гб видео)
>REST (178гб курсов, 94гб видео)
>NoSQL (89гб курсов, 54гб видео
>C++ (163гб курсов, 231гб видео)
>Kotlin (294гб курсов, 128гб видео)
>ИБ (172гб курсов, 98гб видео)
>GoLang (182гб курсов, 283гб видео)
> 1C (291гб курсов, 102гб видео)
>DevOps (92гб курсов, 71гб видео)
>Swift (62гб курсов, 27гб видео)
>Другое (1114гб курсов, 871гб видео)
Не видео на ютуб, а реальный СЛИВ огромных баз. Проверь сам!🚨
6 953
Varargs (Variable Arguments List, изменяющийся список аргументов) — это способ создания методов, которые могут принимать произвольное количество аргументов одного типа (от нуля и более). Данная возможность появилась в JDK 5.
Запись вида
Object... args и есть varargs.
При этом три точки после типа указывают, что метод в качестве аргумента может принимать как массив, так и любую последовательность аргументов, записанных через запятую, которая все равно преобразуется в одномерный массив - «под капотом» компилятор на уровне байт-кода неявно заменяет переданную последовательность массивом. Уже в методе аргумент varargs используется как одномерный массив.
Альтернативой varargs является перегрузка методов или передача в метод массива значений.
Varargs был создан с целью упрощения работы программиста, удобства и краткости кода.
📌 В качестве ограничения любой метод может использовать varargs только в единственном числе и строго последним аргументом.6 953
✅ Тяжело найти хорошую работу Java-разработчика без знания архитектуры Микросервисов?
✅ Хочется охватить все компоненты этой архитектуры и варианты их взаимодействия?
✔️ Перейти на новый уровень синьора, повысить знания по микросервисам, контейнерам и облачным технологиям?
✔️ Уверенно ориентироваться в "живых" проектах и технологиях на стеке Spring Cloud?
ПРЕДЛАГАЕМ ПРОЙТИ ОТКРЫТЫЕ ЗАНЯТИЯ на расширенном курсе по всем основным темам микросервисной архитектуры:
Java Микросервисы, Kafka, Docker, Spring Cloud, Spring WebFlux
🔥В реальном проекте, с выполнением и разбором домашних заданий.
ВЫ ПОЛУЧИТЕ:
➕ Доступ навсегда ко всем материалам занятий и репозиториям микросервисов
➕ Персонализированную поддержку и живое общение в ТГ-группе с темами на каждое занятие
➕ Практику и примеры применения более 30-ти технологий на стеке Spring Cloud
➕ Огромный стек технологий в резюме и группа проектов в портфолио
ИТОГ:
⚡️ Повышенная ценность, как Java-разработчика и новый уровень дохода
⚡️ Полное понимание компонентов микросервисов и их взаимодействия
⚡️ Электронный сертификат об окончании курса
⚡️ Поддержка в специальной группе Telegram, в том числе после завершения обучения
Время прохождения не ограничено, материалы и поддержка даются навсегда.
Первым 500 участникам СКИДКА 50%
ЗАПИСАТЬСЯ ЗДЕСЬ ⬇️⬇️⬇️
https://t.me/JavaOPsBot?start=c-cloud=s-java_tips_and_tricks
6 953
⌨️ Использование
java.util.stream.Collectors для обработки коллекций
Код:
import java.util.List;
import java.util.stream.Collectors;
public class StreamCollectorsExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Примеры использования Collectors
// Преобразование элементов коллекции в строку
String numbersAsString = numbers.stream()
.map(Object::toString)
.collect(Collectors.joining(", "));
System.out.println("Числа в виде строки: " + numbersAsString);
// Получение среднего значения всех элементов коллекции
double average = numbers.stream()
.collect(Collectors.averagingInt(Integer::intValue));
System.out.println("Среднее значение: " + average);
// Фильтрация элементов и сборка их в новую коллекцию
List<Integer> evenNumbers = numbers.stream()
.filter(num -> num % 2 == 0)
.collect(Collectors.toList());
System.out.println("Четные числа: " + evenNumbers);
// Группировка элементов по условию
System.out.println("Числа по остатку от деления на 3: " + numbers.stream()
.collect(Collectors.groupingBy(num -> num % 3)));
}
}
⚙️Этот пример демонстрирует использование класса Collectors из пакета java.util.stream для более эффективной обработки коллекций в Java. Методы класса Collectors предоставляют различные операции для сбора (collecting) элементов из потока данных в различные структуры данных или для выполнения агрегатных операций над элементами потока.6 953
Онлайн-магистратура с IT специальностями от Яндекса
Совместно с ИТМО, МИФИ, МФТИ.
Онлайн-магистратура с актуальными программами и гибким графиком обучения.
Получите высокооплачиваемую IT профессию, официальный диплом и практические знания.
Господдержка оплаты. Совмещение с работой!
Узнать больше
#реклама 16+
О рекламодателе
6 953
⌨️ Switch Expressions
В Java 12 появился новый синтаксис для
switch, который позволяет возвращать значение используя стрелки ->, что делает код более компактным и удобным. Теперь switch может использоваться как выражение, а не только как оператор, что упрощает его применение в логике.
Ранее switch использовался как оператор, и код мог выглядеть громоздко:
String day = "MONDAY";
int numLetters;
switch (day) {
case "MONDAY":
case "FRIDAY":
case "SUNDAY":
numLetters = 6;
break;
case "TUESDAY":
numLetters = 7;
break;
default:
numLetters = 8;
}
System.out.println(numLetters); // Вывод: 6
Со Switch Expressions можно переписать этот код более лаконично:
String day = "MONDAY";
int numLetters = switch (day) {
case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
case "TUESDAY" -> 7;
default -> 8;
};
System.out.println(numLetters); // Вывод: 6
Теперь switch может вернуть значение, и нет необходимости в break.
#java #switch6 953
⌨️ Что такое static метод интерфейса?
Статические методы интерфейса похожи на методы по умолчанию, за исключением того, что для них отсутствует возможность переопределения в классах, реализующих интерфейс.
✔️Статические методы в интерфейсе являются частью интерфейса без возможности переопределить их для объектов класса реализации;
✔️Методы класса
java.lang.Object нельзя переопределить как статические;
✔️Статические методы в интерфейсе используются для обеспечения вспомогательных методов, например, проверки на null, сортировки коллекций и т.д.
Вызывать static метод интерфейса можно используя имя интерфейса:
interface Paper {
static void show() {
System.out.println("static show()");
}
}
class Licence {
public void showPaper() {
Paper.show();
}
}6 953
AI-агенты: новая волна автоматизации бизнеса 🔛
Бизнес все активнее внедряет AI-агентов, которые работают быстрее, дешевле и без усталости.
Это не просто чат-боты, а полноценные цифровые сотрудники, которые автоматизируют процессы в HR, финансах, маркетинге и других сферах.
Админ канала ⏩ Ai, работай! ⏪ подготовил обзор российских и зарубежных решений:
где AI-агенты уже зарабатывают деньги, как они трансформируют рынок и какие технологии стоит изучить сегодня, чтобы не остаться позади.
Забирай PDF бесплатно:
https://t.me/+xkf-cAO3EbM4ZjVi
6 953
⌨️ Что такое default методы интрефейса?
Java 8 позволяет добавлять неабстрактные реализации методов в интерфейс, используя ключевое слово
default:
interface Example {
int process(int a);
default void show() {
System.out.println("default show()");
}
}
✔️Если класс реализует интерфейс, он может, но не обязан, реализовать методы по-умолчанию, уже реализованные в интерфейсе. Класс наследует реализацию по умолчанию.
✔️Если некий класс реализует несколько интерфейсов, которые имеют одинаковый метод по умолчанию, то класс должен реализовать метод с совпадающей сигнатурой самостоятельно. Ситуация аналогична, если один интерфейс имеет метод по умолчанию, а в другом этот же метод является абстрактным - никакой реализации по умолчанию классом не наследуется.
✔️Метод по умолчанию не может переопределить метод класса java.lang.Object.
✔️Помогают реализовывать интерфейсы без страха нарушить работу других классов.
✔️Позволяют избежать создания служебных классов, так как все необходимые методы могут быть представлены в самих интерфейсах.
✔️Дают свободу классам выбрать метод, который нужно переопределить.
✔️Одной из основных причин внедрения методов по умолчанию является возможность коллекций в Java 8 использовать лямбда-выражения.
Вызывать default метод интерфейса в реализующем этот интерфейс классе можно используя ключевое слово super вместе с именем интерфейса:
interface Paper {
default void show() {
System.out.println("default show()");
}
}
class Licence implements Paper {
public void show() {
Paper.super.show();
}
}6 953
🔍Тестовое собеседование на Middle Java-разработчика завтра
14 мая(уже сегодня!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Константин Лесняк, Java-разработчик с большим опытом проведения собесов, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Костя будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Косте
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzquWiHfz
6 953
⌨️ Что такое Heap и Stack память в Java? Какая разница между ними?
Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения.
Stack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел)
Различия между Heap и Stack памятью:
✔️ Куча используется всеми частями приложения, в то время как стек используется только одним потоком исполнения программы.
✔️ Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
✔️ Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.
✔️ Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.
✔️ Если память стека полностью занята, то Java Runtime бросает исключение java.lang.StackOverflowError. Если заполнена память кучи, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space.
✔️ Размер памяти стека намного меньше памяти в куче.
✔️ Из-за простоты распределения памяти, стековая память работает намного быстрее кучи.
Для определения начального и максимального размера памяти в куче используются -Xms и -Xmx опции JVM. Для стека определить размер памяти можно с помощью опции -Xss.
#java #heap #stack #memory
6 953
Сегодня QA.GURU анонсировали закрытый вебинар «Как Python открывает новые горизонты в карьере тестировщика».
Обещают последние тренды QA, блок с лайфкодингом и живую сессию вопросов.
▶ По этой ссылке можно зарегистрироваться для бесплатного участия в этот четверг в 8 вечера мск.
В программе:
— Зачем ручным тестировщикам разбираться в автоматизации и почему Python — оптимальный старт;
— Какие навыки выводят QA в топ в 2025 году (спойлер: нейросети пока не конкуренты);
— Практика: пишем ручной тест, автоматизируем на Python, сравниваем Playwright, Selenium и Selene, запускаем с Pytest и без.
Спикер, Станислав Васенков — QA, за плечами которого больше 10 лет автоматизации, ex-Head of QAA pflb.ru и автор библиотеки allure-notifications. Победитель хакатона по автоматизации тестирования от EPAM. Организатор конференций, спикер Heisenbug, основатель QA.GURU и AUTOTESTS.AI. Стас знает, о чём говорит — и умеет научить.
🔗 Забирайте ссылку. Кто успеет — тот в игре.
6 953
⌨️ Методы compose и andThen интерфейса Function
Function<T,R> — функциональный интерфейс, который умеет принимать объект типа T и возвращать R. У него есть два метода-комбинатора:
default <V> Function<V,R> compose(Function<? super V,? extends T> before)
default <V> Function<T,V> andThen(Function<? super R,? extends V> after)
🔵f.compose(g) → сначала выполняет g, потом результат передаёт в f.
🔵f.andThen(h) → сначала выполняет f, потом h.
✔️ Пример:
import java.util.function.Function;
public class ComposeAndThenDemo {
public static void main(String[] args) {
Function<String, Integer> parse = Integer::parseInt;
Function<Integer, Double> half = i -> i / 2.0;
Function<Double, String> toStr = d -> "Result: " + d;
// Составляем: сначала parse, затем half, затем toStr
Function<String, String> pipeline =
toStr
.compose(half) // toStr(half(x))
.compose(parse); // toStr(half(parse(x)))
// То же самое через andThen:
Function<String, String> pipeline2 =
parse
.andThen(half) // half(parse(x))
.andThen(toStr); // toStr(half(parse(x)))
System.out.println(pipeline.apply("42")); // Result: 21.0
System.out.println(pipeline2.apply("42")); // Result: 21.0
}
}
▸ compose строит цепочку справа-налево (parse → half → toStr).
▸ andThen — слева-направо (parse → half → toStr).6 953
Всем привет! Меня Влад зовут и я разработчик уже целых 8 лет. Последние 2 года работал в компании Uber в Амстердаме, а начинал, кстати, с полного нуля — обычным парнем из деревни.
Если ты мечтаешь попасть в IT, круто зарабатывать и гордиться собой, но не веришь, что это вообще реально — я прекрасно тебя понимаю.
Ты читаешь телеграм-каналы, смотришь ролики на YouTube, и все равно в голове бардак: слишком много всего, а что реально важно — не понятно. Кажется, без специального образования никуда, а страх бросить все на полпути только усиливается.
Поверь, это абсолютно нормально. Я прошел ровно через то же самое и знаю, как помочь тебе не потеряться в море информации и сомнений.
У меня есть решение — четкий и понятный план, как с нуля построить карьеру разработчика и не бросить на полпути, отказавшись от мечты.
Расскажу, с чего начать, как не сдаться и как стать разработчиком, даже если этот путь кажется сложным и нереальным.
Приходи на бесплатный вебинар — “Как начать зарабатывать 200 000₽ в IT за 6 месяцев: путь от нуля до первой работы”.
ЗАПИСАТЬСЯ НА ВЕБИНАР
6 953
⌨️ Описание и назначение разных циклов
Цикл for со счетчиком
for (initialization; condition; update) {
// тело цикла
}
Описание:
initialization: выполняется один раз перед началом цикла. Обычно используется для инициализации счетчика.
condition: проверяется перед каждой итерацией. Если условие истинно, выполняется тело цикла.
update: выполняется после каждой итерации. Обычно используется для изменения счетчика.
int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
System.out.println(i + ": " + numbers[i]);
}
Применение:
Используется, когда известно количество итераций заранее. Часто применяется для работы с массивами или коллекциями, когда нужен индекс.
Цикл for-each
for (type element : collection) {
// тело цикла
}
Описание:
Итерируется по каждому элементу коллекции (например, массива, списка, множества). Обеспечивает удобный способ доступа к каждому элементу без использования индексов.
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println(number);
}
Применение:
Предпочтителен, когда не нужен доступ к индексам элементов.
Цикл while
while (condition) {
// тело цикла
}
Описание:
condition: проверяется перед каждой итерацией. Если условие истинно, выполняется тело цикла.
String code = UUID.randomUUID().toString();
boolean isCodeExists = repo.isCodeExists(code);
while (isCodeExists) {
code = UUID.randomUUID().toString();
isCodeExists = repo.isCodeExists(code);
}
repo.saveCode(code);
Применение:
Используется, когда количество итераций неизвестно заранее и определяется во время выполнения программы. Цикл может не выполниться ни одного раза.
Цикл do-while
do {
// тело цикла
} while (condition);
Описание:
Выполняет тело цикла хотя бы один раз, а затем проверяет условие condition. Если условие истинно, цикл повторяется.
String command;
do {
command = readCommand();
doCommand(command);
} while (!"EXIT".equals(command));
Применение:
Используется, когда тело цикла должно выполниться хотя бы один раз, независимо от условия. Часто применяется для меню или ввода данных, где сначала нужно выполнить действие, а затем проверить условие.
#java #cycles #for #while6 953
Ещё один канал про код?
❌ НЕТ: “Что такое ООП”
❌ НЕТ: “Топ-5 вопросов на собесе”
❌ НЕТ: “Почему монолит — это плохо”
✅ ДА: «Как продать бизнесу рефакторинг»
✅ ДА: «Как не утонуть в легаси»
✅ ДА: «Как проектировать, а не тушить»
Короче, канал для тех, кто уже умеет писать код и теперь пытается выжить в реальных проектах.
erid: 2W5zFJa3bn8
6 953
☕️Работа с сохранением и загрузкой прогресса игрока в Java: сериализация данных
😎Задача:
🟢Сохранить состояние игрового объекта (например, класс Player) в файл. 🟢Загрузить данные из файла при старте игры. 🟢Обеспечить корректную работу даже при изменениях в структуре класса. 🟢Обработать возможные ошибки ввода-вывода.😎Способы решения 🔢Стандартная сериализация Java (Serializable)
🟢Класс реализует интерфейс Serializable, и с помощью ObjectOutputStream и ObjectInputStream объекты записываются и читаются из файла.🔢Использование JSON или XML
🟢Сериализация в человекочитаемый формат с помощью библиотек, например, Gson, Jackson (для JSON) или JAXB (для XML). Это удобно для отладки и совместимости.🔢Кастомная сериализация
🟢Реализация собственных методов записи и чтения данных, например, через DataOutputStream/DataInputStream, что даёт больше контроля над форматом и размером файла.😎Пример реализации на Java с использованием стандартной сериализации
import java.io.*;
class Player implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int level;
int score;
public Player(String name, int level, int score) {
this.name = name;
this.level = level;
this.score = score;
}
@Override
public String toString() {
return "Player{name='" + name + "', level=" + level + ", score=" + score + '}';
}
}
public class SaveLoadGame {
public static void savePlayer(Player player, String filename) {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {
oos.writeObject(player);
System.out.println("Прогресс сохранён.");
} catch (IOException e) {
System.err.println("Ошибка при сохранении: " + e.getMessage());
}
}
public static Player loadPlayer(String filename) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {
return (Player) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
System.err.println("Ошибка при загрузке: " + e.getMessage());
return null;
}
}
public static void main(String[] args) {
Player player = new Player("Игрок1", 5, 1500);
String saveFile = "player.dat";
savePlayer(player, saveFile);
Player loadedPlayer = loadPlayer(saveFile);
if (loadedPlayer != null) {
System.out.println("Загруженный игрок: " + loadedPlayer);
}
}
}
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
